C#中Progress计数器有时无法递增至预期值的问题
代理测试进度计数不准?看这里解决!
嘿,我一眼就看出问题出在哪了——你在异步任务里直接用Progress++来计数,但int类型的递增操作不是线程安全的!
问题根源
当你同时跑多个异步测试任务时,Progress++背后其实是三个独立步骤:读取当前值、加1、写回新值。如果两个任务同时执行这个操作,就会出现竞态条件:比如任务A和任务B都读到当前Progress是98,各自加1变成99,然后都写回去,结果Progress就只增加了1次,而不是2次,最后总数自然就比实际完成的任务数少。
解决方案:用原子操作保证线程安全
你只需要把普通的递增替换成Interlocked.Increment方法,它会保证整个递增操作是原子性的,不会被其他线程打断,完美解决计数丢失的问题。
修改后的代码片段示例:
public class ProxyTester { public int Progress { get; set; } public async Task Start(List<Proxy> proxies, List<ProxyJudge> judges, List<ProxyTest> tests = null, ...) { var testTasks = proxies.Select(async proxy => { // 执行你的代理测试逻辑 await RunProxyTests(proxy, judges, tests); // 替换原来的 Progress++ 为下面这行 Interlocked.Increment(ref Progress); }).ToList(); await Task.WhenAll(testTasks); } }
额外小提醒
如果之后你需要把Progress值更新到UI(比如WPF、WinForms这类界面框架),记得要切换回UI线程更新,不过这部分和你当前的计数问题无关,只是个顺手的小补充~
内容的提问来源于stack exchange,提问作者JohnWick
相关产品推荐
相关产品推荐

