gpt4 book ai didi

c# - 返回 Task 而不是 Task 是完全错误的吗?

转载 作者:太空宇宙 更新时间:2023-11-03 17:29:52 25 4
gpt4 key购买 nike

任务 API 感觉有点像一个失败的坑,考虑到我可以用它做的每件事都伴随着更多的不要而不是。但我正在尝试更多地使用它,而且我对 async void 的整个问题感到困惑。

我的问题发生在我的应用程序永远使用本地数据文件的地方,因为它使用了快速同步调用。现在可以选择一些远程源,它们有足够的延迟,我将其全部切换为异步。

所以我有一个可能看起来像这样的方法:

void InitializeData() {
SomeProperty = _dataSource.Load(...);
}

我想为低摩擦做的天真的事情是:

Task InitializeDataAsync() {
return Task.Run(() => {
SomeProperty = _dataSource.Load(...);
});
}

但是关于使用async void有多么可怕的文章太多了,而且它们似乎与返回任务的讨论混淆了。所以我最好的选择真的是这样写的:

Task<DataType> FetchDataAsync() {
return _dataSource.LoadAsync(...);
}

...然后追捕所有来电者并让他们服从?

我觉得人们提出的论点是 async void 不好,因为 async Task 的不同行为和使用 await< 时可怕的 UnobservedTaskException/。在这种情况下,我不太可能使用 await。或者,如果我确实使用 await,它总是会围绕它进行 try/catch,因为我们已经对 UnobservedTaskException 产生了偏执。

所以:

  • “不要使用 async void”与“不要使用 Task”是一回事吗?
  • 如果您不使用 await,它会缓解这种情况吗?
  • 如果您确实使用了 await,是否总是用 try/catch 包装它来缓解问题?

最佳答案

async void 与返回 Task 不同。 async void 的问题是没有办法观察任务异常(除了全局异常处理程序),也没有办法等待任务完成(你实际上不能 await 一个 async void 方法,因为没有什么可以await),这就是应该避免的原因。

返回 Task 没有这些问题,如果你 await 它你知道它什么时候完成并且你会在你等待的地方得到异常所以返回一个 Task 是完全可以接受的。

关于c# - 返回 Task 而不是 Task<T> 是完全错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49018632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com