【发布时间】:2012-12-06 04:38:09
【问题描述】:
我读过 Ansyc/Await 的“BackgroundWorker”是designed to be replaced。
因为我喜欢 Async/Await 的简洁外观,所以我开始将我的一些 BackgroundWorker 转换为 Async/Await 调用。
这是我拥有的代码示例(从 UI 调用):
public async void RunFromTheUI()
{
await OtherAction();
}
public async void OtherAction()
{
var results = await services.SomeRemoteAction();
foreach (var result in results)
{
result.SemiIntenseCalculation();
Several();
Other();
NonAsync();
Calls();
}
SomeFileIO();
}
当我调用 RunFromTheUI 时,它几乎会立即返回(根据 Async 和 Await 设计)。
但是当它在services.SomeRemoteAction() 完成后恢复时,它有一个foreach 循环和另一个要运行的方法调用。
我的问题是:如果该循环是性能猪,它会冻结 UI 吗?(在我将它全部放在后台工作线程中之前,它不会减慢 UI 的速度)。
注意:我的目标是 .Net 4.0 并使用 Async Nuget 包。
【问题讨论】:
-
async/await 和 BackgroundWorker 解决了两个不同的问题。 BG worker 更精确地被 Tasks 取代。异步仅在工作主体代码基本上空闲时替换这些,当您需要进行繁重的工作时,BGW/Tasks 仍然有用。我看起来您正在等待问题中的服务结果,仅供参考。
-
1.你的代码不会编译,你不能
awaitasync void方法。 2.你应该避免使用async void方法,它们不能是awaited并且使异常处理更加困难。
标签: c# .net async-await