C# 4.0 参数在任务运行时读取,而不是在声明时读取
我正试图找出如何正确地做到这一点。在“Task MyTask=new Task(()=>Match.UserObject.InitUser(tmpUserObject));”中,tmpUserObject在任务运行时得到评估,而不是在声明时得到评估。因为这似乎是一个“特性”,所以在声明任务时必须有一种正确的方法来使用tmpUserObject的值 谢谢:-) 这叫做a。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
这是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);
}
}