2012-01-31 26 views
0

我试图找出如何正确执行此操作。 “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); 

回答

1

从我能告诉你的代码中,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); 
    } 
} 
+0

tmpUserObject的“值”是参考“值”,也就是内存位置。每次我将tmpUserObject分配给一个新对象时,参考值都会改变。我需要在创建任务时“捕捉”此引用的值。 – Bengie 2012-01-31 22:06:06

+0

看到我需要做出改变的编辑。 – 2012-01-31 22:10:08

1

这就是所谓的一个closure
这是C#更强大的功能之一。

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

+0

谢谢:-)现在我至少有一个术语可以查询。由于在任务/ lambda/etc中有很多结果,所以我很难搜索这个问题。 – Bengie 2012-01-31 21:56:18

+0

如果我很难找到一个例子,因为它听起来很简单,你有没有一个例子来说明如何“评估表达“? – Bengie 2012-01-31 21:59:24

+1

就你而言,这非常简单。只需在循环内声明变量,以便每个lambda(闭包实例)都获得一个单独的变量。 – SLaks 2012-01-31 22:14:32