Кросс-поточная операция после использования EventHandler - PullRequest
0 голосов
/ 04 октября 2018

Мне нужно было создать событие в другом классе, поэтому я использовал 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;

Любые идеи, пожалуйста?

РЕДАКТИРОВАТЬ:

Я использую фоновый работник для обновления пользовательского интерфейса, получая последовательные команды в форме Form1.В другом классе я использую Task.Run, чтобы установить напряжение + напряжение чтения, пока я не на установленном напряжении.Затем я использую EventHandler для отправки события в Form1, чтобы он знал, что напряжение было установлено, прежде чем перейти к следующему шагу.

RE-EDIT:

Теперь я вижу, что у меня есть дваПотоки 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

Можно ли сказать,компилятор для продолжения использования существующего потока форм и не начинать новый?

...