参数在任务运行时读取,而不是在声明时读取
问题描述:
我试图找出如何正确执行此操作。 “Task MyTask = new Task(()=> Match.UserObject.InitUser(tmpUserObject));”,tmpUserObject在任务运行时得到评估,而不是在声明时评估。由于这似乎是一个“特征”,因此在声明任务时必须有正确的方法来使用tmpUserObject的值。参数在任务运行时读取,而不是在声明时读取
感谢:-)
Match.UserObject tmpUserObject;
while (myReader.Read())
{
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);
}
}
//Block until all the tasks are done
Task[] MyTaskArray = TaskList.ToArray();
Task.WaitAll(MyTaskArray);
答
从我能告诉你的代码中,tmpUserObject
是一个类实例。它从未被“评估过”。传递给任务的lambda(() => Match.UserObject.InitUser(tmpUserObject)
)会在任务运行时进行评估,这是异步发生的。这是Task对象的目的。
当你说“使用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);
}
}
tmpUserObject的“值”是参考“值”,也就是内存位置。每次我将tmpUserObject分配给一个新对象时,参考值都会改变。我需要在创建任务时“捕捉”此引用的值。 – Bengie 2012-01-31 22:06:06
看到我需要做出改变的编辑。 – 2012-01-31 22:10:08