0

重複の可能性:
クロススレッド操作が無効です: コントロールが作成されたスレッド以外のスレッドからアクセスされました

BackgroundWorker で動作させるのに問題があります。

クリックすると BackgroundWorkers RunWorkerAsync メソッドを呼び出したいチェックボックスがあります。

    private void checkBoxLoadRecords_CheckedChanged(object sender, EventArgs e)
    {
        bw.RunWorkerAsync();
    }

DoWork イベント内で、コンボの 1 つで SelectionChangeCommitted イベントを呼び出します。

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        comboSelectedIDs_SelectionChangeCommitted(sender, e);
    }

SelectionChangeCommitted メソッド内で、ID を変数に取得しようとした最初の行でエラーが発生します。私が受け取ったエラーは次のとおりです:クロススレッド操作が無効です:コントロール 'comboSelectedIDs' は、それが作成されたスレッド以外のスレッドからアクセスされました。

void comboSelectedIDs_SelectionChangeCommitted(object sender, EventArgs e)
{
    int idToUse = (int)multiSelectedIDs.SelectedValue; //Errors here!
    SetupNamesCombo(idToUse);
}

この問題を回避するにはどうすればよいですか?

カスタムコントロールを使用すると、コンボテキスト値を使用するため、同様の問題が発生すると思います。これを BackgroundWorker で取得したいと考えています。

私はC#4.0を使用しています

前もって感謝します。

4

2 に答える 2

0

Dispatcher クラスを使用して、さまざまなスレッドから UI 要素にアクセスします。

        Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            int idToUse = (int)multiSelectedIDs.SelectedValue;
        });

または、コード ビハインド ファイルを使用している場合は、Deployment.Current.

于 2012-08-13T13:15:03.127 に答える
0

UI スレッド以外のスレッドで UI コントロールにアクセスすることはできません。

1 つの解決策は、UI コントロールの値を別の POCO オブジェクトに保存して、バックグラウンド ワーカーからアクセスできるようにすることです。

于 2012-08-13T13:15:29.460 に答える