任务库生成随机结果

本文关键字:随机 结果 任务 | 更新日期: 2023-09-27 18:37:05

我有 2 个关于 c# 中任务工厂的问题。1)为什么此代码中的结果会随机更改?请注意,如果我单步执行代码,那么它就可以工作了。2)如果我更改 Div 方法以引发异常,那么 WaitForAll 方法就会崩溃。有解决方法吗?

List<Task<float>> tasks = new List<Task<float>>();
for (float i = -3.0f; i < 3.0f; i+=1.0f)
{
    Console.WriteLine("sent " + i);
    Task<float> task = Task.Factory.StartNew<float>(() => Div(5.0f, i));
    tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
foreach(Task<float> t in tasks)
{
    if (t.IsFaulted)
    {
        Console.WriteLine("Something went wrong: " + t.Exception);
        break; // abort
    }
    else
    {
        Console.WriteLine("result: " + t.Result);
    }
}
private static float Div(float a, float b)
{
    Console.WriteLine("got " + b);
    if (b == 0) return 0.0f;// throw new Exception("Divide by zero");
    return a / b;
}

结果随机变化。这是结果之一:

sent -3
sent -2
sent -1
sent 0
sent 1
sent 2
got 2
got 2
got 2
got 2
got 2
got 3
result: 2.5
result: 1.666667
result: 2.5
result: 2.5
result: 2.5
result: 2.5

任务库生成随机结果

闭包。

在将i传递到Task之前for循环中的局部变量中赋值:

List<Task<float>> tasks = new List<Task<float>>();
for (float i = -3.0f; i < 3.0f; i+= 1.0f)
{
    float input = i;
    Console.WriteLine("sent " + i);
    Task<float> task = Task.Factory.StartNew<float>(() => Div(5.0f, input));
    tasks.Add(task);
}

否则,i将在循环和所有任务之间共享,因此当循环使用 i += 1.0f 递增时,所有任务也会看到更改。这就是为什么你会得到一堆2打印出来got.