C#でWindows Windowsを使用する場合、場合によっては、「無効なクロススレッド操作」に遭遇する可能性があります。このエラーは、コントロールの作成以外のスレッドからコントロールにアクセスしようとしたときに発生します。 UIスレッドをブロックする可能性のあるデータ操作を実行しようとすると、この問題は通常、開発者がデータロードにバックグラウンドスレッドを使用していることを示すために発生します。
問題を理解してください
提供されたシナリオでは、別のスレッドにデータをロードしようとし、UI(ユーザーコントロールを含む)がメインスレッドに作成されます。ユーザーがコントロールしたロードイベントアクセス制御コントロール(テキストボックスの値を確認するなど)の場合、「無効なクロススレッド操作」エラーがトリガーされます。これは、コントロールがメインスレッドに作成され、スレッドアソシエーションルールに違反するために別のスレッドから訪問したためです。 Invokerequered Security Access Controlを使用
可能なソリューションは、コントロールの制御属性を使用することです。この属性は、現在のスレッドがコントロールによって作成されたスレッドと同じかどうかを示します。 trueが返される場合、正しいスレッドでコードを呼び出す必要があることを意味します。
コードの例 この例では、最初の行で、Invokerequiredが真であるかどうかを確認します。その場合は、正しいスレッドのコードブロックを呼び出して、UIへの正しいアクセスを確認してください。
代替:間接アクセス制御値別の方法は、間接的に制御値を取得することです。バックグラウンドスレッドから直接コントロールにアクセスしないでください。ただし、メインスレッド上の値を取得し、バックグラウンドワーキングデバイスに渡します。
この場合、テキストボックスの値はメインスレッドで取得され、ローカル変数に保存されます。次に、バックグラウンドスレッドでのデータ読み込み操作は、この変数を安全に使用できます。
<code class="language-csharp">UserContrl1_LoadDataMethod() { if (textbox1.InvokeRequired) // 第 1 行 { this.Invoke(new MethodInvoker(UserContrl1_LoadDataMethod)); return; } if (textbox1.Text == "MyName") // 现在不会引发异常 { // 加载与“MyName”对应的数据 // 填充稍后将绑定到网格的全局变量 List<string> } }</code>
「無効なクロススレッド操作」異常を回避するために、スレッドアソシエーションルールに準拠し、スレッドアクセス制御を作成することに注意してください。 Invokerequedを使用して他のスレッドからコントロールを安全に更新するか、間接アクセス方法を使用して正しいスレッドの制御値を取得することを検討します。
以上がバックグラウンドスレッドからWindowsフォームコントロールに安全にアクセスする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。