将具有更改值的参数传递给任务 - 行为

本文关键字:参数传递 任务 行为 | 更新日期: 2023-09-27 18:31:23

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

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