.NET Framework
同期コンテキスト
サーチ…
備考
同期コンテキストとは、作業のスケジュール方法を意識することなく、作業単位をスケジューラに渡すようにコードを消費する抽象です。
同期コンテキストは伝統的にコードが特定のスレッド上で実行されるようにするために使用されます。 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