在异步方法中处理空任务的最佳方法
本文关键字:最佳 方法 任务 异步方法 处理 | 更新日期: 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;
}
}