我需要在另一个类中创建一个事件,因此我使用了一个EventHandler,并且可以正常工作,但是现在以我的主类形式,当我尝试使用任何我得到的控件时:
Cross-thread operation not valid
所以研究后我可以调用:
tbMessage.Invoke((Action)delegate
{
tbMessage.Size = new System.Drawing.Size(500, 60);
this.Controls.Add(tbMessage);
});
但是,如果我在整个表单中都执行此操作,则会有大量实例,我要在其中移动,调整大小,更改控件负载的文本。这似乎不正确,与使用我不知道的EventHandle有关。在将一些代码移到新类并使用任务和事件之前,这些错误并没有发生。
我在
完成后和之前都未订阅该活动dvm.VoltageSet -= dvmVoltageSet;
有什么想法吗?
编辑:
我正在使用后台工作程序更新UI,同时在Form1中接收串行命令。在另一堂课中,我使用Task.Run设置电压+读取电压,而我未达到设置电压。然后,我使用EventHandler将事件发送到Form1,以便在继续下一步之前知道已设置了电压。
重新编辑:
我现在可以看到我有两个Windows.Forms线程,这导致了我的错误。当我在另一个类中调用一个方法时,这似乎正在发生,当它在form1中导致一个事件,并且我尝试使用控件时,它将启动一个新线程。
Not Flagged > 4432 8 Worker Thread Worker Thread System.Windows.Forms.dll!System.Windows.Forms.Control.Handle.get Normal
[External Code]
TestSensor.exe!TestSensor.Form1.TestLvdtNull() Line 3113
TestSensor.exe!TestSensor.Form1.dvmVoltageSet(object sender, VoltageEventArgs e) Line 414
TestSensor.exe!TestSensor.DVMLoopRunner.OnNewVoltageSet(VoltageEventArgs e) Line 71
TestSensor.exe!TestSensor.DVMLoopRunner.NewSet.set(bool value) Line 57
TestSensor.exe!TestSensor.DVMLoopRunner.AdjustVoltage() Line 295
TestSensor.exe!TestSensor.DVMLoopRunner.Form1_DVMReadingAvailable(object sender, TestSensor.DVMLoopRunner.DVMReadingAvailableEventArgs e) Line 147
TestSensor.exe!TestSensor.DVMLoopRunner.ReadDVM() Line 192
TestSensor.exe!TestSensor.DVMLoopRunner.ReadDVMWorker() Line 173
TestSensor.exe!TestSensor.DVMLoopRunner.SetVoltage.AnonymousMethod__49_0() Line 95
[External Code]
Not Flagged 6768 1 Main Thread Main Thread System.Windows.Forms.dll!System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop Normal
[External Code]
TestSensor.exe!TestSensor.Program.Main() Line 17
Not Flagged 11048 0 Worker Thread <No Name> Normal
Not Flagged 668 4 Worker Thread <No Name> System.dll!System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent Normal
Not Flagged 5888 5 Worker Thread <No Name> System.dll!System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent Normal
Not Flagged 12968 0 Worker Thread <No Name> Normal
Not Flagged 11924 6 Worker Thread Worker Thread Normal
是否可以告诉编译器继续使用现有的Forms线程而不启动新线程?