c# - serial - "Operación de hilo cruzado no válido".. mientras lee datos en el puerto serie
recibir datos de arduino en c# (3)
Su controlador de eventos no se está ejecutando en el hilo de la interfaz de usuario. Para obtener el subproceso de UI, use el método Invoke del formulario principal.
En una aplicación de formulario de Windows, en la carga de formulario principal, configuré un puerto serie y comencé a leerlo. El propósito es, a medida que reciba algunos datos en el puerto serie, que quiero abrir otro formulario relacionado con los datos.
Así que utilizo el controlador de eventos DataReceived del puerto serie.
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();
}
}
Pero cuando intento abrir un formulario dentro del controlador de eventos, me da una InvalidOperationExeption que dice: "Operación entre hilos no válida: Control ''Principal'' a la que se accede desde un hilo que no sea el hilo en el que se creó."
Intenté eliminar la línea de código: Main.Instance.customerData.MdiParent = Main.Instance;
entonces funciona bien Pero también es necesario asignar el mdiparent para abrirlo como una forma secundaria.
Alguna sugerencia para resolver este problema?
Use el método Invoke en el formulario principal. Tienes que pasar el control al formulario principal para interactuar con él. El controlador de eventos se desencadena en un hilo de fondo.
Aquí hay un código de muestra que puede funcionar:
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();
}
}
Eso es simplemente porque un mandamiento de subprocesamiento en Windows es "No deberás acceder a la IU desde ningún otro hilo, excepto el hilo de la IU".
Por lo tanto, debe usar Control.Invoke para ejecutar el código que accede a la interfaz de usuario en el hilo de la interfaz de usuario.
//assuming your within a control and using C# 3 onward..
this.Invoke( () =>
{
//anything that UI goes here.
}
);
Un poco de Ninja Google Search te habría ayudado. Esto pasa a ser un problema bastante infame.
Esta respuesta parece ser casi exactamente su problema: el funcionamiento entre hilos no es válido mientras escucha un puerto COM