Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 参数在任务运行时读取,而不是在声明时读取_C# 4.0_Task - Fatal编程技术网

C# 4.0 参数在任务运行时读取,而不是在声明时读取

C# 4.0 参数在任务运行时读取,而不是在声明时读取,c#-4.0,task,C# 4.0,Task,我正试图找出如何正确地做到这一点。在“Task MyTask=new Task(()=>Match.UserObject.InitUser(tmpUserObject));”中,tmpUserObject在任务运行时得到评估,而不是在声明时得到评估。因为这似乎是一个“特性”,所以在声明任务时必须有一种正确的方法来使用tmpUserObject的值 谢谢:-) 这叫做a。 这是C#更强大的功能之一 如果您想预先计算表达式,可以将其放在lambda之外的单独变量中。从我对您的代码的了解来看,tmpU

我正试图找出如何正确地做到这一点。在“Task MyTask=new Task(()=>Match.UserObject.InitUser(tmpUserObject));”中,tmpUserObject在任务运行时得到评估,而不是在声明时得到评估。因为这似乎是一个“特性”,所以在声明任务时必须有一种正确的方法来使用tmpUserObject的值

谢谢:-)

这叫做a。
这是C#更强大的功能之一


如果您想预先计算表达式,可以将其放在lambda之外的单独变量中。

从我对您的代码的了解来看,
tmpUserObject
是一个类实例。它从不被“评估”。当任务运行时,会计算传递给任务的lambda(
()=>Match.UserObject.InitUser(tmpUserObject)
),该过程是异步进行的。这就是任务对象的目的

当你说“使用tmpUserObject的值”时,你实际上是什么意思

编辑:要捕获值,需要在每次迭代中将其分配给新变量。只需将变量的作用域重新设置到循环内部即可:

while (myReader.Read())
{
    // Since we moved this inside the loop, the variable's scope has changed.
    Match.UserObject tmpUserObject;    
    if (tmpDict.TryGetValue(UserID, out tmpUserObject))
    {
        tmpUserObject.vchSchoolID.Add(myReader.GetString(5));
    }
    else
    {
        tmpUserObject = new Match.UserObject();
        //Assign some values from reader...
        //Do any processing eg. DoubleMetaphone pre-computation...etc...
        Task MyTask = new Task(() => Match.UserObject.InitUser(tmpUserObject));
        TaskList.Add(MyTask);
    }
}

谢谢:-)现在我至少有一个术语可以查了。我很难用谷歌搜索这个问题,因为在tasks/lambda/etcIn案例中有很多结果。我很难找到一个例子,因为它听起来很简单,你有一个如何“提前计算表达式”的例子吗?在你的案例中,它很简单。只需在循环中声明变量,这样每个lambda(闭包实例)就可以得到一个单独的变量。每次我将tmpUserObject指定给新对象时,参考值都会更改。我需要在创建任务时“捕获”此引用的值。
while (myReader.Read())
{
    // Since we moved this inside the loop, the variable's scope has changed.
    Match.UserObject tmpUserObject;    
    if (tmpDict.TryGetValue(UserID, out tmpUserObject))
    {
        tmpUserObject.vchSchoolID.Add(myReader.GetString(5));
    }
    else
    {
        tmpUserObject = new Match.UserObject();
        //Assign some values from reader...
        //Do any processing eg. DoubleMetaphone pre-computation...etc...
        Task MyTask = new Task(() => Match.UserObject.InitUser(tmpUserObject));
        TaskList.Add(MyTask);
    }
}