任务库生成随机结果
本文关键字:随机 结果 任务 | 更新日期: 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
.