«Операция с несколькими потоками недопустима» .. при чтении данных через последовательный порт - PullRequest
1 голос
/ 29 марта 2011

В приложении Windows Form при загрузке основной формы я установил последовательный порт и начал читать его.Цель состоит в том, чтобы, когда я получаю некоторые данные на последовательном порту, я хочу открыть другую форму, связанную с данными.

Поэтому я использую обработчик событий DataReceived для последовательного порта.

  void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {

            string str = this.serialPort1.ReadLine();


                if (!string.IsNullOrEmpty(str))
                {


                    Main.Instance.customerData = new CustomerData(str);
                    Main.Instance.customerData.MdiParent = Main.Instance;  //Exeption received at this point
                    Main.Instance.customerData.Disposed += new EventHandler(customerData_Disposed);

                    Main.Instance.customerData.Show();


                }

        }

Но когда я пытаюсь открыть форму в обработчике событий, она выдает мне InvalidOperationExeption: «Операция с несколькими потоками недопустима: доступ к элементу управления Main осуществляется из потока, отличного от потока, которым он былсоздан на. "

Я попытался удалить строку кода: Main.Instance.customerData.MdiParent = Main.Instance; тогда он работает нормально.Но необходимо также назначить mdiparent, чтобы открыть его как дочернюю форму.

Есть предложения по решению этой проблемы?

Ответы [ 3 ]

1 голос
/ 29 марта 2011

Ваш обработчик событий не работает в потоке пользовательского интерфейса.Чтобы попасть в поток пользовательского интерфейса, используйте метод Invoke основной формы.

1 голос
/ 29 марта 2011

Это просто потому, что в Windows используется потоковая команда "Вы не должны получать доступ к пользовательскому интерфейсу из какого-либо другого потока, кроме потока пользовательского интерфейса"

Так что вам нужно использовать Control.Вызвать для запуска кода, который обращается к пользовательскому интерфейсу в потоке пользовательского интерфейса.

//assuming your within a control and using C# 3 onward..
this.Invoke( () =>
 {
   //anything that UI goes here.
 }
);

Немного Ниндзя Stackoverflow Google Search Вам бы помогло.Это довольно печально известная проблема.

Похоже, этот ответ почти полностью соответствует вашей проблеме: Операция с несколькими потоками недопустима при прослушивании COM-порта

1 голос
/ 29 марта 2011

Используйте метод Invoke в главной форме.Вы должны передать контроль главной форме, чтобы взаимодействовать с ней.Обработчик событий запускается в фоновом потоке.

Вот пример кода, который может работать:

void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    string str = this.serialPort1.ReadLine();
    if (!string.IsNullOrEmpty(str))
    {
        ShowCustomerData(str);
    }   

}

private delegate void ShowCustomerDataDelegate(string s);

private void ShowCustomerData(string s)
{
    if (Main.Instance.InvokeRequired)
    {
        Main.Instance.Invoke(new ShowCustomerDataDelegate(ShowCustomerData), s);
    }
    else
    {

        Main.Instance.customerData = new CustomerData(str);
        Main.Instance.customerData.MdiParent = Main.Instance;  //Exeption received at this point
        Main.Instance.customerData.Disposed += new EventHandler(customerData_Disposed);

        Main.Instance.customerData.Show();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...