假设我有一个等待任务的方法。此方法还返回一个任务。例如:
public async virtual Task Save(String path)
{
if (NewWords.Any())
{
await FileManager.WriteDictionary(path, NewWords, true);
}
else await Task.Run(() => { });
}
是
else await Task.Run(() => { });
这里有必要还是我可以随意离开它?存在/不存在有什么区别吗?也许我应该采取其他一些方法?
最佳答案
这比不必要更糟糕,因为您正在启动一个线程什么也不做,然后等待它完成什么都不做。
什么都不做最简单的方法就是什么都不做。在 async
方法 该方法仍会返回一个 Task
,但是Task
已经完成了,所以一些事情await
进一步向上将直接进入它需要做的下一件事:
public async virtual Task Save(String path)
{
if (NewWords.Any())
{
await FileManager.WriteDictionary(path, NewWords, true);
}
}
(另外,如果这里的方法名是SaveAsync
和WriteDictionaryAsync
就更符合惯例了)。
如果不使用 async
(这里没有必要,但我知道这是一个例子)使用 Task.CompletedTask
:
public virtual Task Save(String path)
{
if (NewWords.Any())
{
return FileManager.WriteDictionary(path, NewWords, true);
}
return Task.CompletedTask;
}
如果您针对早于 4.6 的框架进行编码,因此没有 CompletedTask
可用,然后 Task.Delay(0)
作为 Delay
很有用特殊情况值0
返回缓存的已完成任务(实际上,与 CompletedTask
返回的任务相同):
public virtual Task Save(String path)
{
if (NewWords.Any())
{
return FileManager.WriteDictionary(path, NewWords, true);
}
return Task.Delay(0);
}
但是 4.6 方式更清楚您的意图,而不是依赖于实现的怪癖。
关于c# - 如果有条件地执行任务,异步方法应该做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36499297/