Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待是否使方法的其余部分异步?_C#_.net_Async Await - Fatal编程技术网

C# 等待是否使方法的其余部分异步?

C# 等待是否使方法的其余部分异步?,c#,.net,async-await,C#,.net,Async Await,我读过Ansyc/Await写的“幕后工作者” 因为我喜欢Async/Await的精简外观,所以我开始将一些BackgroundWorkers转换为Async/Await调用 这是我的代码示例(从UI调用): 当我从UI调用run时,它几乎会立即返回(根据异步和等待设计) 但是当它在services.SomeRemoteAction()完成后恢复时,它有一个foreach循环和另一个要运行的方法调用 我的问题是:如果该循环是一个性能猪,它会冻结UI吗?(在我将其全部放在后台工作线程中之前,它不会

我读过Ansyc/Await写的“幕后工作者”

因为我喜欢Async/Await的精简外观,所以我开始将一些BackgroundWorkers转换为Async/Await调用

这是我的代码示例(从UI调用):

当我从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();
}