You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7 AsyncCallback委托示例的线程安全性疑问

.NET 7 AsyncCallback 示例中 ProcessDnsInformation 的线程安全问题解析

首先明确:官方示例里的 ProcessDnsInformation 方法本身并没有做线程安全的代码层面保障,你看到的「不会并发执行 hostNames.Add(hostName)」,本质是依赖示例的演示场景,而非代码本身的设计。

具体拆解:

  • 官方示例的典型流程是:用户手动输入一个主机名,程序发起单次异步DNS查询,回调完成后将结果加入列表。这种逐个发起请求的交互模式下,回调自然是串行执行的,不会出现并发调用 Add 的情况——这就是你说的「用户输入导致竞态风险低」的原因,这确实是示例里避免并发的核心因素,但并非唯一可能的场景。
  • 如果修改示例代码,比如循环发起多个异步DNS请求(同时调用多次 Dns.BeginGetHostEntry),那么多个回调会在不同的线程池线程上并发执行,此时 List<T>.Add 这种非线程安全的方法就会触发竞态条件,可能导致列表元素丢失、计数错误甚至程序崩溃。
  • 官方示例的定位是演示 AsyncCallback 的基本用法,而非线程安全集合的使用,所以它没有额外加锁或者使用线程安全集合(比如 ConcurrentBag<T>)。如果要让代码在并发场景下安全,你需要自己添加线程同步逻辑,比如用 lock 包裹 hostNames.Add 的调用,或者直接替换为线程安全的集合类型。

内容的提问来源于stack exchange,提问作者fskj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:36:01