作成されたスレッド以外のスレッドからcombobox.Textを読み取ろうとしていますが、エラーが発生します。
タイプSystem.InvalidOperationExceptionの未処理の例外がSystem.Windows.Forms.dllで発生しました
追加情報:クロススレッド操作は無効です:作成されたスレッド以外のスレッドからアクセスされたコントロール 'levelsComboBox'。
以前に.Invokeを使用しましたが、プロパティを設定するためだけに使用しました。これを使用してcombobox.Textを読み取るにはどうすればよいですか? .Invokeはvoidを返し、文字列が必要だからです。または、呼び出しなしでそれを行う別の方法はありますか?
あなたはこのようにそれを行うことができます:
this.Invoke((MethodInvoker)delegate()
{
text = combobox.Text;
});
引き続きInvoke
を使用して、ローカル変数に読み取ることができます。
このようなもの:
string text;
this.Invoke(new MethodInvoker(delegate() { text = combobox.Text; }));
Invoke
は同期的であるため、コンボボックステキストの値が返された後、text
変数にその値が含まれることが保証されます。
最短の方法は:
string text;
this.Invoke(() => text = combobox.Text);
最も簡単な解決策は、 BackgroundWorker クラスを使用して別のスレッドで作業を実行しながら、UIを更新しながら(たとえば、進捗状況を報告するときやタスクが完了したとき)です。