8

「BackgroundWorker」はAnsyc/Awaitに置き換えられるように設計されていることを読みました。

私はAsync/Awaitの凝縮された外観が好きなので、BackgroundWorkersの一部を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をターゲットにしており、AsyncNugetPackageを使用しています。

4

1 に答える 1

6

私の質問は次のとおりです。そのループがパフォーマンスの低下である場合、UIがフリーズしますか?

はい、そうなります。リモートアクションが完了した場合でも、残りの非同期メソッドはUIスレッドで実行されます。それを望まない場合のオプションは次のとおりです。

  • UIスレッドでConfigureAwait(continueOnCapturedContext: false)継続が実行されないようにするために使用します
  • を使用して、最初に別のスレッドでメソッド全体を実行しTask.Runます。(必要のないときにスレッドをブロックしないように、非同期メソッドにすることもできます。)

基本的に、同期呼び出し、ブロッキング呼び出し、またはCPUを集中的に使用する作業のいずれかが大量に発生する場合は、UIスレッドで発生することを回避する必要があります。これは、デフォルトでasync/が実行するのとは逆です。await

于 2012-12-18T21:52:14.433 に答える