如果有条件地执行任务,异步方法应该怎么做?

假设我有一个等待任务的方法。 此方法还返回一个Task。 例如:

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

(此外,如果SaveAsyncWriteDictionaryAsync是此处的方法名称,它将更符合惯例)。 如果不使用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方式更清楚你的意图,而不是依赖于一个实施的怪癖。

这不是必要的。 只有在使用至少一个await时才需要async 。 方法内的所有内容都是同步执行的,除了await和后面的内容。