1

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

4

0 回答 0