从任务返回null

时间:2012-09-11 11:22:21

标签: c# task-parallel-library

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,那么我怎么能返回空任务呢?

1 个答案:

答案 0 :(得分:2)

您的代码没有任何意义,原因有两个:

  1. 启动一个不包含任何长时间运行代码的任务是没用的。你将无法从中获益
  2. 等待任务在启动后立即完成,完全否定了任务的效果:您仍在阻止主线程。
  3. 如果任务中的代码真的很简单,请将代码更改为:

    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());