2012-09-11 45 views
4
var hs = new HashSet<int>(); 

foreach(var item in mainclass) 
{ 
    Task<List<Class1>> cl1Task = Task.Factory.StartNew<List<Class1>>(() => 
    { 
     if (!hs_VersiodIDs.Contains(item.VersionID)) 
     { 
      return new List<Class1>(.....); 
     } 
     else 
     { 
      return null; 
     } 
    }); 

    Task.WaitAll(cl1Task); 
} 

它不等待任务完成。问题是返回null,所以如何返回空任务?从任务返回null

回答

2

您的代码是没有意义的,原因有二:

  1. 开始不包含任何长期运行的代码是没用的任务。你将不会从这个优势中获益
  2. 等待任务在开始后立即完成,完全否定任务的效果:你仍然阻止你的主线程。

你的代码改成这样,如果在任务的代码就是这么简单:

foreach(var item in mainclass) 
{ 
    List<Class1> result; 
    if (!hs_VersiodIDs.Contains(item.VersionID)) 
    { 
     result = new List<Class1>(.....); 
    } 
    else 
    { 
     result = null; 
    } 
} 

如果任务中的代码确实一些昂贵的东西,你的代码改成这样:

var tasks = new List<Task>(); 
foreach(var item in mainclass)  
{  
    Task<List<Class1>> cl1Task = Task.Factory.StartNew<List<Class1>>(() =>  
    {  
     if (!hs_VersiodIDs.Contains(item.VersionID))  
     {  
      return new List<Class1>(.....);  
     }  
     else  
     {  
      return null;  
     }  
    });  

    tasks.Add(cl1Task); 
} 

// note, WaitAll is outside the loop, so now our tasks can all run in parallel 
Task.WaitAll(tasks.ToArray()); 
+0

它不是完整的代码只是当我返回null时,问题即将到来 – Haider

+4

@Haider然后,请显示一个最小的例子来演示这个问题。 “return null;'没有什么神奇的东西,它本身并不是你遇到的任何问题的原因。 – hvd

+0

sORRY.the问题不是在这个函数中,而是在parallel.foreach我加入列表中,一些如何两个值null使用concurrentbag和所有工作正常,但性能低。再一次对不起所有 – Haider