0

これによると

BackgroundWorker がその DoWork ハンドラーから別の BackgroundWorker を開始する場合、ネストされた BackgroundWorker は UI SynchronizationContext をキャプチャしません

ここに画像の説明を入力

ただし、.NET 4.0、特に 4.5 以降では、次のようなサンプル コードを多数見てきました

public partial class Form1 : Form
{
   public Form1()
   {
      InitializeComponent();

      Shown += async ( s, e ) => { txtResult.Text = await DownloadAsync() + "Done!"; };
   }

   async Task<string> DownloadAsync()
   {
      using ( var wc = new WebClient() )
      {
         var progress = new Progress<DownloadStringTaskAsyncExProgress>();

         progress.ProgressChanged += ( s, e ) =>
            {
               progressBar.Value = e.ProgressPercentage;
               txtResult.Text += e.Text;
            };

         return await wc.DownloadStringTaskAsyncEx(
            @"http://ancillaryasync.nickbutler.net/Murphy.ashx", progress );
      }
   }
}

したがって、タスクを使用して非同期呼び出しをネストできるように見え、SynchronizationContext はネストされた呼び出しをフロートダウンします。これは正しいです?

もしそうなら、誰かがTAPがこれを非常に高いレベルでどのように行うかを説明してもらえますか.

そうでない場合、ネストされた呼び出しが UI スレッドに投稿できるようにするために何をする必要がありますか?

それとも、元の記事に対する私の理解が完全に間違っているのでしょうか? 新しいタスクを作成すると、デフォルトで現在の同期コンテキストが取得されますか? もしそうなら、明示的に新しい同期コンテキストを与えない限り、元の同期コンテキスト以外でどのように実行できますか?

混乱を解消するのを手伝ってください。

4

1 に答える 1