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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:30:29