根据心智模型将状态变量提供给任务 lambda "serial"而不是"last value"?



我了解关闭的关闭,而不是封闭变量的值。那不是我的问题。我想知道如何表达(向编译器)"给出此任务,如创建时所见,而不是执行时的值。"

换句话说,我如何获得

static void Main(string[] args)
{
    var userName = "Alice";
    var task = new Task(() =>
    {
        Console.WriteLine("User is: " + userName);
    });
    // continues work ...
    userName = "Zoltan";
    task.Start();
    Console.ReadLine();
}

打印

User is: Alice

而不是现在所做的,即

User is: Zoltan

我试图避免

Task.Factory.StartNew((copy) =>
{
     Console.WriteLine("User is: " + (string)copy);
}, userName); 

迫使我将每个状态对象(例如用户名)重新铸造到实际lambda中的相应类型中,因为StartNew方法接口将其定义为object类型而不是通用接口(例如:<T>)。上面的演示示例似乎可以使用字符串和一个writeline-但是对于带有大物体的真实情况,并且在屏幕上的所有代码上重新铸造有些浪费(并且容易出错)。

我通常只使用临时变量来封闭场景:

var userName = "Alice";
var taskUserName = userName;
var task = new Task(() =>
{
    Console.WriteLine("User is: " + taskUserName);
});

编辑:

完成读取稍有不同的同一操作的另一种方法是将任务创建重构为一种方法:

static void Main(string[] args)
{
   var userName = "Alice";
   var task = CreateUserTask(userName);
   // ...
}
static Task CreateUserTask(string taskUserName)
{
    return new Task(() =>
    {
        Console.WriteLine("User is: " + taskUserName);
    });
}

最新更新