Dispatcher.Invoke を介して他のスレッドの WPF コントロールを安全に変更します
WPF アプリケーションでは、バックグラウンド スレッドからユーザー インターフェイスへのアクセスは注意して処理する必要があります。 Dispatcher.Invoke
メソッドは、非メインスレッドからコントロールと安全に対話するためのメカニズムを提供します。
Dispatcher.Invoke について
Dispatcher
は、UI スレッドのメッセージ キューの管理を担当します。 UI 要素にアクセスしようとしているスレッドは、まず Dispatcher.Invoke
メソッドを呼び出して、UI スレッド上で必要な操作を実行する必要があります。これにより、UI の応答性が維持され、更新がスムーズに進むことが保証されます。
Dispatcher.Invoke を使用する
バックグラウンド スレッドから WPF コントロールを変更するには:
<code class="language-csharp">Action<string> action = (text) => myLabel.Content = text;</code>
Dispatcher
を呼び出し、デリゲートと操作の優先順位を渡します。たとえば、バックグラウンド優先でデリゲートを実行するには: <code class="language-csharp">Application.Current.Dispatcher.BeginInvoke( DispatcherPriority.Background, action, "Hello from another thread!" );</code>
代替方法
Dispatcher.Invoke
は状況によっては便利ですが、長時間実行される操作にはお勧めできません。代わりに次の代替手段の使用を検討してください:
async
/await
など) は、非同期操作を処理するためのより簡単かつ効率的な方法を提供します。 サンプルシーン
Web サービスからデータを取得する WPF アプリケーションがあるとします。取得したデータで UI を更新するには、BackgroundWorker
を使用してバックグラウンドでデータをダウンロードします。次に、BackgroundWorker
の ReportProgress
イベントを使用して Dispatcher
を呼び出し、UI を更新できます。
<code class="language-csharp">backgroundWorker.ReportProgress(0, "Downloading data..."); Application.Current.Dispatcher.Invoke(() => myLabel.Content = "Data downloaded"); backgroundWorker.ReportProgress(100, "Download complete");</code>
以上が他のスレッドから WPF コントロールを安全に変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。