在异步方法中处理空任务的最佳方法

本文关键字:最佳 方法 任务 异步方法 处理 | 更新日期: 2023-09-27 18:34:34

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

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;
   }
}

在异步方法中处理空任务的最佳方法

您不需要处理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);
}

如果任务从不为 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();
  }
}

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

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

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;
   }
}