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

C#向异步方法传参出现重复值 如何正确传递唯一字符串

问题原因

这是C#中lambda闭包的变量捕获机制导致的典型问题:
你代码中的str变量声明在foreach循环外部,属于所有迭代共享的变量。lambda表达式() => CallAsync(str)捕获的是这个变量的引用,而非你创建Task时str的瞬时值。
由于Task.Run是异步调度的,提交的任务不会立刻执行,等到线程池实际执行lambda读取str值时,foreach循环可能已经执行到后续迭代,str已经被覆盖为新的值,就会出现多个任务拿到相同参数的情况。

正确解决方法

只需要把需要捕获的变量声明在foreach循环的每次迭代内部即可,每次迭代会创建独立的局部变量,每个lambda捕获的是对应迭代专属的变量,不会被后续迭代覆盖:

static async void WorkerMainAsync()
{
    List<Task> trackedTasks = new List<Task>();
    int[] jobs = new int[] { 0,1,2,3,4,5 };

    foreach (int num in jobs)
    {
        // 每次迭代创建独立的局部变量,不要用循环外共享的变量
        string currentStr = num.ToString();
        Console.WriteLine("pass: {0}", currentStr);
        trackedTasks.Add(Task.Run(() => CallAsync(currentStr)));
    }
    await Task.WhenAll(trackedTasks);

    Console.WriteLine("[*] All jobs finished.");
}

修改后每个任务的入参都会和传递的参数完全一一对应,不会再出现重复的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:09:00