任务API感觉有点像失败的坑,给每一个可能的事情,我可以用它做怎样带有更多DO NOT比DO.但是我试图更多地使用它,我对整个问题感到困惑async void.
我的问题发生在我的应用程序永远使用本地数据文件的地方,因为它使用了快速同步调用.现在一些远程源是一个选项,它们有足够的延迟我将它全部切换为异步.
所以我有一个方法可能看起来像这样:
void InitializeData() {
SomeProperty = _dataSource.Load(...);
}
Run Code Online (Sandbox Code Playgroud)
我想为低摩擦做的天真的事情是:
Task InitializeDataAsync() {
return Task.Run(() => {
SomeProperty = _dataSource.Load(...);
});
}
Run Code Online (Sandbox Code Playgroud)
但是有很多关于使用它有多可怕的文章async void,并且它们似乎在讨论返回任务时变得模糊.所以我最好的选择就是这样写:
Task<DataType> FetchDataAsync() {
return _dataSource.LoadAsync(...);
}
Run Code Online (Sandbox Code Playgroud)
...然后追捕所有来电者并让他们遵守?
我觉得人们所做的论证async void是不好的,因为async Task你使用时的不同行为和可怕的UnobservedTaskException await.在这种情况下,我不太可能使用await.或者,如果我使用await,它总是会有一个try/catch,因为我们已经对UnobservedTaskException产生了偏执.
所以:
async void" 和"不要使用"相同Task吗?await,它会缓解吗?await,总是用try/catch包装它可以缓解这个问题吗?async void与回归不一样Task.问题async void是没有办法观察任务异常(除了全局异常处理程序之外),也没办法等待任务完成(你实际上不能用await一个async void方法因为什么都没有await),这就是为什么它应该避免.
返回Task没有这些问题,如果你await知道什么时候它完成,你会得到例外,等待所以返回a Task是完全可以接受的.
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |