サーチ…


備考

同期コンテキストとは、作業のスケジュール方法を意識することなく、作業単位をスケジューラに渡すようにコードを消費する抽象です。

同期コンテキストは伝統的にコードが特定のスレッド上で実行されるようにするために使用されます。 WPFおよびWinformsアプリケーションでは、UIスレッドを表すSynchronizationContextがプレゼンテーションフレームワークによって提供されます。このようにして、 SynchronizationContextはデリゲートのプロデューサ/コンシューマパターンと考えることができます。ワーカースレッドは、実行可能なコード(デリゲート)を生成し、UIメッセージループによってそれや消費をキューに入れます。

タスクパラレルライブラリには、同期コンテキストを自動的にキャプチャして使用するための機能が用意されています。

バックグラウンド作業を行った後、UIスレッドでコードを実行する

この例は、 SynchronizationContextを使用してバックグラウンドスレッドからUIコンポーネントを更新する方法を示しています

void Button_Click(object sender, EventArgs args)
{
    SynchronizationContext context = SynchronizationContext.Current;
    Task.Run(() =>
    {
        for(int i = 0; i < 10; i++) 
        {
            Thread.Sleep(500); //simulate work being done
            context.Post(ShowProgress, "Work complete on item " + i);
        }
    }
}

void UpdateCallback(object state)
{
    // UI can be safely updated as this method is only called from the UI thread
    this.MyTextBox.Text = state as string;
}

この例では、 forループ内のMyTextBox.Textを直接更新しようとすると、スレッドエラーが発生します。 SynchronizationContext UpdateCallbackアクションをポストすることで、残りのUIと同じスレッドでテキストボックスが更新されます。

実際には、進行状況の更新はSystem.IProgress<T>インスタンスを使用して実行する必要があります。既定の実装System.Progress<T>は、作成された同期コンテキストを自動的に取得します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow