使用EventHandler后的跨线程操作

时间:2018-10-04 11:16:36

标签: c# winforms events ui-thread cross-thread

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

0 个答案:

没有答案