c#背景スレッド例外:「クロススレッド操作は無効:制御 '...'で作成されたスレッド以外のスレッドからアクセスされます。 この記事では、バックグラウンドスレッドとUI要素を使用するときに遭遇する一般的なC#エラーについて説明します。 これは、UI要素が通常、メインUIスレッドによって作成および所有されるために発生します。 バックグラウンドスレッドからそれらを変更しようとすると、スレッドの安全性が違反します。
問題:例外は、バックグラウンドスレッドがメインスレッドで作成されたUI要素(テキストボックスやその他のコントロールなど)にアクセスまたは変更しようとすると発生します。 WPFおよびその他のUIフレームワークは、人種の条件とデータの腐敗を防ぐためにこの制限を実施します。 解決策:
を使用します
ソリューションには、メソッドを使用してUIアップデートをメインスレッドに戻すことが含まれます。 Dispatcher.Invoke
正しいスレッドでUIアップデートが発生し、クロススレッドアクセス違反が解決されます。
Dispatcher.Invoke
Dispatcher.Invoke
:という名前のテキストボックスを更新する必要があるバックグラウンドスレッドで実行されているメソッドがあるとしましょう。
オリジナル(問題のある)コード:GetGridData
txtSearchCountry
:
を使用してコードを修正しました<code class="language-csharp">private void GetGridData(object sender, int pageIndex) { // ... other code ... objUDMCountryStandards.Country = txtSearchCountry.Text.Trim() != string.Empty ? txtSearchCountry.Text : null; // ... more code ... }</code>
メソッドは、代表者(この場合は匿名の関数)を引数として取得します。 この代表者には、UIスレッドで実行する必要があるコードが含まれています。 Dispatcher.Invoke
は、デリゲートがUIスレッドで実行を完了するまでブロックします。 これにより、スレッドの安全性が保証されます
<code class="language-csharp">private void GetGridData(object sender, int pageIndex) { // ... other code ... this.Dispatcher.Invoke(() => { objUDMCountryStandards.Country = txtSearchCountry.Text.Trim() != string.Empty ? txtSearchCountry.Text : null; }); // ... more code ... }</code>への割り当てがメインUIスレッドで安全に実行され、例外が防止されます。 このパターンをバックグラウンドスレッドから実行したすべてのUI要素変更に適用することを忘れないでください。
以上がなぜ私のC#バックグラウンドスレッドが「呼び出しスレッドがこのオブジェクトにアクセスできない」とスローするのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。