C# 等待是否使方法的其余部分异步?
我读过Ansyc/Await写的“幕后工作者” 因为我喜欢Async/Await的精简外观,所以我开始将一些BackgroundWorkers转换为Async/Await调用 这是我的代码示例(从UI调用): 当我从UI调用C# 等待是否使方法的其余部分异步?,c#,.net,async-await,C#,.net,Async Await,我读过Ansyc/Await写的“幕后工作者” 因为我喜欢Async/Await的精简外观,所以我开始将一些BackgroundWorkers转换为Async/Await调用 这是我的代码示例(从UI调用): 当我从UI调用run时,它几乎会立即返回(根据异步和等待设计) 但是当它在services.SomeRemoteAction()完成后恢复时,它有一个foreach循环和另一个要运行的方法调用 我的问题是:如果该循环是一个性能猪,它会冻结UI吗?(在我将其全部放在后台工作线程中之前,它不会
run时,它几乎会立即返回(根据异步和等待设计)
但是当它在services.SomeRemoteAction()
完成后恢复时,它有一个foreach
循环和另一个要运行的方法调用
我的问题是:如果该循环是一个性能猪,它会冻结UI吗?(在我将其全部放在后台工作线程中之前,它不会降低UI的速度)
注意:我的目标是.NET4.0并使用AsyncNuGet包
我的问题是:如果这个循环是一个性能猪,它会冻结用户界面吗
是的,会的。当远程操作完成时,异步方法的其余部分仍将在UI线程上执行。如果您不希望发生这种情况,那么可以选择:
- 使用,使延续不会在UI线程上执行
- 使用
Task.Run
在不同的线程中执行整个方法。(您仍然可以将其设置为异步方法,以避免在不需要时阻塞线程。)
基本上,如果您有大量的同步、阻塞调用或CPU密集型工作,您希望避免在UI线程上发生这种情况,这与默认情况下async
/wait
为您所做的相反。Task.Run
比Task.Factory.StartNew
具有更好的默认值(如果您使用async
)@史蒂芬克利里:修好了,谢谢。我没有注意到-任务。StartNew
一开始就无效,当然:)Jon:阅读/理解async/Wait,任务有什么好的起点吗?@shahkalpesh:这些都是很好的起点。非常感谢Jon爵士:)async/await和BackgroundWorker解决两个不同的问题。BG工人更准确地被任务取代。Async仅在工作人员代码基本处于空闲状态时才替换这些代码,而BGW/任务在您需要执行繁重工作时仍然有用。我看你在等待问题中的服务结果,仅供参考。1。您的代码无法编译,您不能等待异步void
方法。2.您应该避免使用async void
方法,它们不能wait
ed并使异常处理更加困难。
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();
}