传递参数与变化值任务 - 行为?(Passing arguments with changing v

2019-06-23 17:01发布

情形:在一个循环中的异步任务执行包含改变,因为程序继续参数的方法:

while(this._variable < 100)
{
    this._variable++; 
    var aTask = Task.Factory.StartNew(() =>
    {
        aList.add(this._variable);
        update(this._savePoint);
    });
}

如果循环的运行速度比完成任务快,将在列表中添加变量的当前值或变量保存在本地,并添加原始值?

Answer 1:

封关过的变量,而不是值。 因此,增加_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是引用类型,这些解决方案是行不通的; 你不得不进行克隆。



文章来源: Passing arguments with changing values to Task — Behaviour?