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

时间:2016-04-08 12:14:34

标签: c# async-await task

假设我有一个等待任务的方法。此方法还返回一个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(() => { });
这里有必要还是我可以自由离开?如果它存在/不存在有什么区别吗?也许我应该采取其他方法吗?

2 个答案:

答案 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; } 可用,那么CompletedTaskTask.Delay(0)特殊情况有用Delay返回一个缓存的已完成任务(实际上,与0返回的那个相同):

CompletedTask

但4.6方式更清楚你的意图,而不是依赖于实施的怪癖。