c# - 从任务返回 null

标签 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 );
}

它不会等待任务完成。问题是 return null 那么我怎样才能返回空任务?

最佳答案

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

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

关于c# - 从任务返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12368583/

相关文章:

c# - 从另一个类访问私有(private)方法

c# - 从现有数据库向 DbContext 添加表?

c# - 如何使用 XAML 在整个容器(如 Panel 或 GroupBox)上设置 IsReadOnly/IsEnabled?

c# - 如何将枚举绑定(bind)到组合框

.net - TPL 数据流与普通信号量

c# - 为什么 AsyncUnaryCall<T> 和其他人不扩展 Task<T>?

c# - 使用 SemaphoreSlim 限制 TPL 数据流的问题

c# - 是否可以将 SQLite.NET 与不可变记录类型一起使用?

c# - 使用 ContinueWith 自继续任务

c# - 多个短期 TPL 数据流与单个长期运行的数据流