asu*_*rey 20 c# scope .net-4.0 task-parallel-library
场景:循环中的异步任务执行一个方法,该方法包含随程序继续而变化的参数:
while(this._variable < 100)
{
this._variable++;
var aTask = Task.Factory.StartNew(() =>
{
aList.add(this._variable);
update(this._savePoint);
});
}
Run Code Online (Sandbox Code Playgroud)
如果循环运行得比任务完成的速度快,列表是否会添加变量的当前值,还是本地保存的变量并添加原始值?
Igb*_*man 18
闭包关闭变量,而不是值.因此,递增_variable 可以改变引用它的任务的行为.
您可以通过制作本地副本来防止这种情况:
while (this._variable < 100)
{
this._variable++;
int local = _variable;
var aTask = Task.Factory.StartNew(() =>
{
aList.add(local);
update(this._savePoint);
});
}
Run Code Online (Sandbox Code Playgroud)
或者您可以将值作为状态传递给任务:
while (this._variable < 100)
{
this._variable++;
var aTask = Task.Factory.StartNew(object state =>
{
aList.add((int)state);
update(this._savePoint);
}, this._variable);
}
Run Code Online (Sandbox Code Playgroud)
这些都通过将值复制_variable到新的临时变量来工作.在第一种情况下,local变量是在循环范围内定义的,因此每次迭代都会得到一个新变量.在第二种情况下,您将_variable作为state参数传递给Task 的值的副本.如果_variable是参考类型,这些解决方案将无效; 你必须执行克隆.
| 归档时间: |
|
| 查看次数: |
10208 次 |
| 最近记录: |