.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
相关产品推荐
相关产品推荐

