1

BackgroundWorker DoWorkイベント 内でフォーム コントロールにアクセスすると、 DatePickerから値が読み取られますが、 TextBoxまたはComboBoxからは読み取られません。

エラー:

Cross-thread operation not valid: Control 'cmbProgram' accessed from a thread other than the thread it was created on.

ここに画像の説明を入力

コード :

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        string strDate = dtpDate.Value.ToString();

        string strProgram = cmbProgram.Text;

    }

(別のスレッドで) DataPicker からどのように値を読み取りますか?

BackgroundWorker DoWorkイベントからフォーム コントロールにアクセスするための回避策はありますか?

4

3 に答える 3

2

別のスレッドからコントロールにアクセスすることはできません。この問題を回避する通常の方法は、UI スレッドから現在の値を読み取り、その値を 2 番目のスレッド (または BackgroundWorker) に渡すことです。

コントロール クラスの CheckForIllegalCrossThreadCalls を false に設定することでチェックを無効にすることができますが、これは行わないでください。

于 2012-05-04T09:49:22.303 に答える
2

使用する:

Dispatcher.Invoke(new Action(() =>
           {
                string strDate = dtpDate.Value.ToString();
                string strProgram = cmbProgram.Text;

           }));
于 2012-05-04T09:53:15.133 に答える
1

引数として渡すことができます。例えば:

backgroundworker1.RunWorkerAsync(comboBox1.SelectedItem.ToString());

doWorkwithの内容を取得します。

string Item = e.Argument.ToString();
于 2012-05-04T09:53:38.747 に答える