情形:在一个循环中的异步任务执行包含改变,因为程序继续参数的方法:
while(this._variable < 100)
{
this._variable++;
var aTask = Task.Factory.StartNew(() =>
{
aList.add(this._variable);
update(this._savePoint);
});
}
如果循环的运行速度比完成任务快,将在列表中添加变量的当前值或变量保存在本地,并添加原始值?
封关过的变量,而不是值。 因此,增加_variable
可以改变的是指它的任务的行为。
您可以通过一个本地副本防止这种情况:
while (this._variable < 100)
{
this._variable++;
int local = _variable;
var aTask = Task.Factory.StartNew(() =>
{
aList.add(local);
update(this._savePoint);
});
}
或者你可以传递价值的任务,状态:
while (this._variable < 100)
{
this._variable++;
var aTask = Task.Factory.StartNew(object state =>
{
aList.add((int)state);
update(this._savePoint);
}, this._variable);
}
这些都是由价值复制工作_variable
到一个新的临时变量。 在第一种情况下, local
变量是循环的范围内定义的,所以你每次迭代一个新的。 在第二种情况下,你做的值的副本_variable
当你将它传递给任务的state
参数。 如果_variable
是引用类型,这些解决方案是行不通的; 你不得不进行克隆。