假设我有一个等待任务的方法。此方法还返回一个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(() => { });
这里有必要还是我可以自由离开?如果它存在/不存在有什么区别吗?也许我应该采取其他方法吗?
答案 0 :(得分:5)
这不是必要的。只有在使用至少一个async
时才需要await
。方法内的所有内容都是同步执行的,除了await
以及之后的内容。
答案 1 :(得分:5)
它比不必要的更糟糕,因为你正在旋转一个线程什么都不做,然后等到它什么都没做之后就等了。
无所事事的最简单方法是什么都不做。在let requestURL = NSURL(string:url)
let request = NSURLRequest(URL: requestURL!)
webView.loadRequest(request)
方法中,该方法仍会返回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
如果您使用的是早于4.6之前的框架进行编码,因此没有public virtual Task Save(String path)
{
if (NewWords.Any())
{
return FileManager.WriteDictionary(path, NewWords, true);
}
return Task.CompletedTask;
}
可用,那么CompletedTask
对Task.Delay(0)
特殊情况有用Delay
返回一个缓存的已完成任务(实际上,与0
返回的那个相同):
CompletedTask
但4.6方式更清楚你的意图,而不是依赖于实施的怪癖。