如果有条件地执行任务,异步方法应该怎么做?
假设我有一个等待任务的方法。 此方法还返回一个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); } }
(此外,如果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方式更清楚你的意图,而不是依赖于一个实施的怪癖。
这不是必要的。 只有在使用至少一个await
时才需要async
。 方法内的所有内容都是同步执行的,除了await
和后面的内容。