可以';无法访问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列表中。然而,我仍然想知道为什么一个后台工作人员可以在主窗体上看到文本框,而另一个却不能。
按照Austin所说的去做并调用()所有调用。
你只是随机地遇到了这个异常(我不在乎它是否一致),从工作线程对UI的任何调用都可能导致异常,因为只有主线程必须访问UI。
我敢打赌,当你第一次访问.Text属性时,控件本身不需要重新绘制,但第二次需要,所以你会以跨线程异常结束。