通过更改值传递参数到任务 – 行为?

场景:循环中的异步任务执行一个方法,该方法包含随程序继续而变化的参数:

while(this._variable  { 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参数传递给Task时,可以复制该值。 如果_variable是引用类型,则这些解决方案不起作用; 你必须执行克隆。