Bal*_*ázs 5 c# task async-await
假设我有一个等待任务的方法.此方法还返回一个Task.例如:
public async virtual Task Save(String path)
{
if (NewWords.Any())
{
await FileManager.WriteDictionary(path, NewWords, true);
}
else await Task.Run(() => { });
}
Run Code Online (Sandbox Code Playgroud)
是个
else await Task.Run(() => { });
Run Code Online (Sandbox Code Playgroud)
这里有必要还是我可以自由离开?如果它存在/不存在有什么区别吗?也许我应该采取其他一些方法吗?
它比不必要的更糟糕,因为你正在开始一个线程什么也不做,然后等到它什么都没做之后.
无所事事的最简单方法是什么也不做.在一个async方法中,该方法仍然会返回一个Task,但是Task已经完成了,所以await进一步的东西将直接进入它需要做的下一件事:
public async virtual Task Save(String path)
{
if (NewWords.Any())
{
await FileManager.WriteDictionary(path, NewWords, true);
}
}
Run Code Online (Sandbox Code Playgroud)
(同样,这将是更符合约定,如果SaveAsync和WriteDictionaryAsync是这里的方法名).如果不使用async(并且没有必要在这里,但我理解这是一个例子)使用Task.CompletedTask:
public virtual Task Save(String path)
{
if (NewWords.Any())
{
return FileManager.WriteDictionary(path, NewWords, true);
}
return Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是早于4.6的框架进行编码,因此没有CompletedTask可用的,那么返回缓存的已完成任务的值(实际上,返回的是同一个)的特殊情况Task.Delay(0)很有用:Delay0CompletedTask
public virtual Task Save(String path)
{
if (NewWords.Any())
{
return FileManager.WriteDictionary(path, NewWords, true);
}
return Task.Delay(0);
}
Run Code Online (Sandbox Code Playgroud)
但4.6方式更清楚你的意图,而不是依赖于一个实施的怪癖.
| 归档时间: |
|
| 查看次数: |
1520 次 |
| 最近记录: |