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