在异步方法中处理空任务的最佳方法是什么?

时间:2014-12-18 16:17:51

标签: c# .net task-parallel-library async-await

null方法中处理async任务的最佳方法是什么?

public class MyClass
{
   private readonly Task task;
   public MyClass(Task task) { this.task = task; }

   public async Task Execute()
   {
      if (task == null)
      {
         await Task.Yield(); /* Is this the best way? */
         return;
      }
      await task;
   }
}

3 个答案:

答案 0 :(得分:15)

您不需要处理null任务。只需检查它:

public async Task Execute()
{
   if (task != null)
   {
       await task;
   }
}

甚至更好,只需返回任务,因为您在await之后没有添加任何内容:

public Task Execute()
{
   return task;
}

如果您想要返回已完成的任务而不是null,则可以使用Task.FromResult

public Task Execute()
{
   return task ?? Task.FromResult(false);
}

答案 1 :(得分:11)

如果任务永远不为null,则大多数异步代码都更清晰。而不是null任务,使用Task.FromResult(0)或一些此类构造。

public class MyClass
{
  private readonly Task task;
  public MyClass(Task task) { this.task = task ?? Task.FromResult(0); }

  public async Task ExecuteAsync()
  {
    await task;
  }
}

或者,如果那真的是你ExecuteAsync正在做的事情:

public Task ExecuteAsync()
{
  return task;
}

请注意,在调用构造函数时,任务已在运行,这使得方法名称ExecuteAsync用词不当。如果您希望在调用ExecuteAsync启动任务,那么您真正想要存储的是Func<Task>

public class MyClass
{
  private readonly Func<Task> func;
  public MyClass(Func<Task> func) { this.func = func ?? () => Task.FromResult(0); }

  public async Task ExecuteAsync()
  {
    await func();
  }
}

答案 2 :(得分:0)

  

在异步方法中处理空任务的最佳方法是什么?

最佳做法通常包括不允许空参数(除非业务规则要求它们)。

public class MyClass
{
   private readonly Task _task;

   public MyClass(Task task) 
   { 
     if (task == null)
     {
       throw new ArgumentNullException("task");
     }

     this._task = task; 
   }

   public async Task Execute()
   {
      await this._task;
   }
}