Межпотоковая операция недопустима (Как получить доступ к элементам WinForm из событий другого модуля?)

У меня есть модуль с событием для последовательного порта Sygnal

serialPort.DataReceived.AddHandler(SerialDataReceivedEventHandler(DataReceived));

где DataReceived находится

let DataReceived a b =
    rxstring <- serialPort.ReadExisting()
    arrayRead <- System.Text.Encoding.UTF8.GetBytes(rxstring)
    if arrayRead.[0] = 0x0Auy then
        ProcessData(a, null)

и ProcessData вызывает метод WinForms

let ProcessData(a, b) =
    dataProcessor.Invoke(a, b) |> ignore

который

private void ProcessData(object sender, EventArgs e) {
   byte[] m = Core.ncon.ArrayRead;
   switch (m[1]) {
      case 0x01: {
          if (m.Length > 5) {
             int myval = BitConverter.ToInt32(m, 3);
             textBox1.Text += " val: " + myval.ToString() + " ";

но когда он пытается получить доступ к textBox1, я получаю:

Недопустимая операция между потоками: элемент управления textBox1 доступен из потока, отличного от потока, в котором он был создан.

Итак, вопрос в том, как получить доступ к элементам WinForm из событий другого модуля?

 Zenwalker11 окт. 2012 г., 12:22
Возможно, MethodInvoker?

Ответы на вопрос(2)

this.Invoke(new MethodInvoker(delegate() 
{ 
//Access your controls
}));

надеюсь это поможет

Решение Вопроса

Вам нужно использовать диспетчер форм.

FormContaingTheTextbox.Invoke(new MethodInvoker(delegate(){
    textBox1.Text += " val: " + myval.ToString() + " ";
}));

Это заставляет этот код работать в потоке форм вместо вашего.

 PhonicUK11 окт. 2012 г., 13:45
Затем вам нужно заставить свой код вызывать событие, которое форма может прослушать, а затем выполнить вызов. Ваш модуль не должен пытаться изменить свойства формы напрямую.
 Cynede11 окт. 2012 г., 14:05
благодарю вас! работает просто отлично

Ваш ответ на вопрос