1

BackgroundWorker DoWork当我在事件中 访问表单控件时,它会从DatePicker读取值,但不会从TextBoxComboBox读取值

错误:

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 线程读取当前值,然后将该值传递给第二个线程(或 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 回答