在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;
}
}
答案 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;
}
}