可以';无法访问TextBox.后台工作程序中的文本

本文关键字:工作程序 后台 文本 TextBox 访问 可以 | 更新日期: 2023-09-27 18:29:08

我有一个winforms应用程序,它最初被设计为具有不同的顺序功能,通过按钮手动触发(4个按钮没有相应的后台工作人员,4个按钮有相应的后台人员,总共8个按钮)。每个按钮同步地进行一些快速设置,然后启动后台工作程序以异步方式完成工作。这可能是繁重的工作。

决定使用一个"express"选项,该选项使用默认选项完成4个按钮的所有工作。不幸的是,我没有把它设计成模块化的。

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

这里有一些伪代码,按钮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中,我有两个文本框,用户可以在其中输入信息。

在backgroundworker1(对应于上面的button5)中,我可以访问第一个TextBox的.Text属性。然而,在backgroundworker2(对应于button6)中,我无法访问其他TextBox的.Text属性。我可以在button6点击事件中一直访问它,直到调用RunWorkerSync()。当我在后台工作2试图访问TextBox时,Text会冻结程序。也不例外,它只是停了下来。

以下是我的理论:backgroundworker1在button5单击事件中被调用/运行而不带任何参数backgroundworker2使用button6单击事件中的参数调用/运行通过在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的params列表中。然而,我仍然想知道为什么一个后台工作人员可以在主窗体上看到文本框,而另一个却不能。

可以';无法访问TextBox.后台工作程序中的文本

按照Austin所说的去做并调用()所有调用。

你只是随机地遇到了这个异常(我不在乎它是否一致),从工作线程对UI的任何调用都可能导致异常,因为只有主线程必须访问UI。

我敢打赌,当你第一次访问.Text属性时,控件本身不需要重新绘制,但第二次需要,所以你会以跨线程异常结束。