我需要在另一个类中创建一个事件,所以我使用了一个 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 线程而不是启动一个新线程?