无法访问Background worker中的TextBox.Text

时间:2016-01-06 16:51:26

标签: c# .net winforms backgroundworker

我有一个winforms应用程序,最初设计为具有通过按钮手动触发的不同顺序功能(4个按钮没有相应的后台工作人员,4个按钮带有相应的后台工作人员,总共8个按钮)。每个按钮都会同步快速设置,然后触发后台工作程序异步执行工作。这可能是繁重的工作。

决定使用“快速”选项,使用默认选项完成4个按钮的所有工作。不幸的是,我并没有把它设计成我应该拥有的模块化。

我所做的是让ExpressButton调用第5个后台工作程序,后者依次按顺序调用每个按钮上的InvokeOnClick。幸运的是,首先调用了4个非异步按钮。我正在使用AutoResetEvent来阻止第5个后台工作程序,同时单击每个顺序按钮。

这里有一些伪代码,按钮1-4不调用后台工作者,按钮5-8调用后台工作者,而_resetevent = new AutoResetEvent(false)在全局变量中:

 private void backgroundWorker5_DoWork(object sender, DoWorkEventArgs e)    
 {
        ControlEventArgs automationcheck = new ControlEventArgs(expressButton);

        InvokeOnClick(button1, null);
        System.Threading.Thread.Sleep(500);
        InvokeOnClick(button2, null);
        System.Threading.Thread.Sleep(500);
        InvokeOnClick(button3, null);
        System.Threading.Thread.Sleep(500);
        InvokeOnClick(button4, null);
        System.Threading.Thread.Sleep(500);
        InvokeOnClick(button5, automationcheck);
        _resetevent.WaitOne();
        _resetevent.Reset();
        InvokeOnClick(button6, automationcheck);
        _resetevent.WaitOne();
        _resetevent.Reset();
        InvokeOnClick(button7, automationcheck);
        _resetevent.WaitOne();
        _resetevent.Reset();
        InvokeOnClick(button8, automationcheck);
        _resetevent.WaitOne();
        _statusBox.AppendText("Finished" + Environment.NewLine);
}

所以这是奇怪的事情。在UI中,我有2个文本框,用户可以在其中输入信息。

在backgroundworker1(对应于button5),我可以访问第一个TextBox的.Text属性。 但是在backgroundworker2(对应于button6)中,我无法访问其他TextBox的.Text属性。 我可以在button6点击事件中一直访问它,直到我调用RunWorkerAsync()。 一旦我在backgroundworker2尝试访问TextBox.Text冻结程序。没有例外,它只是停止。

这是我的理论: backgroundworker1被调用/运行,没有来自button5点击事件的参数 使用button6 click事件中的参数调用/运行backgroundworker2 通过在RunWorkAsync(params [])中传递一个对象列表,我是否导致它没有传递原始表单控件的某些上下文? 这里有趣的是,在主窗体上有另一个名为statusBox的文本框,我仍然可以在backgroundworker2中访问,实际上这就是我一直用于调试的目的。

所以回顾一下。

Button 9    
  Backgroundworker 5
    Button 1
    Button 2
    Button 3
    Button 4
    Button 5
      Backgroundworker 1
        Can access TextBox.Text here
    Button 6
      Backgroundworker 2
        Can't access TextBox.Text here
    Button 7
      Backgroundworker 3
         unsure
    Button 8
      Backgroundworker 4
         unsure

最坏情况:

由于button6仍然可以访问文本框,我可以抓取文本并将其传递给runworkerasync的参数列表。但是我仍然想知道为什么1个背景工作者可以在主窗体上看到一个文本框而另一个不能。

1 个答案:

答案 0 :(得分:2)

按照Austin的说法和Invoke()所有的电话。

你正在随机地点击这个异常(我不在乎它是否一致),从工作线程调用UI可能会导致异常,因为只有主线程必须访问UI。

我敢打赌,当您第一次访问.Text属性时,控件本身不需要重绘,但第二次需要重绘,因此您将以交叉线程异常结束。