web-dev-qa-db-ja.com

作成されたスレッド以外のスレッドからコンボボックスを読み取る方法は?

作成されたスレッド以外のスレッドからcombobox.Textを読み取ろうとしていますが、エラーが発生します。

タイプSystem.InvalidOperationExceptionの未処理の例外がSystem.Windows.Forms.dllで発生しました

追加情報:クロススレッド操作は無効です:作成されたスレッド以外のスレッドからアクセスされたコントロール 'levelsComboBox'。

以前に.Invokeを使用しましたが、プロパティを設定するためだけに使用しました。これを使用してcombobox.Textを読み取るにはどうすればよいですか? .Invokeはvoidを返し、文字列が必要だからです。または、呼び出しなしでそれを行う別の方法はありますか?

28
nitrkli

あなたはこのようにそれを行うことができます:

this.Invoke((MethodInvoker)delegate()
    {
        text = combobox.Text;
    });
51
BrandonZeider

引き続きInvokeを使用して、ローカル変数に読み取ることができます。

このようなもの:

string text;

this.Invoke(new MethodInvoker(delegate() { text = combobox.Text; }));

Invokeは同期的であるため、コンボボックステキストの値が返された後、text変数にその値が含まれることが保証されます。

17
João Angelo

最短の方法は:

string text;
this.Invoke(() => text = combobox.Text);
4
Igor Vaschuk

最も簡単な解決策は、 BackgroundWorker クラスを使用して別のスレッドで作業を実行しながら、UIを更新しながら(たとえば、進捗状況を報告するときやタスクが完了したとき)です。

3
Morten Mertner