utilizo un BackgroundWorker y hacer esto:¿Por qué no conseguir la "operación de la Cruz-hilo no válida" error
private void loadNewAsyncToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Text = "RunWorkerAsync()";
backgroundWorkerLoading.RunWorkerAsync();
}
private void backgroundWorkerLoading_DoWork(object sender, DoWorkEventArgs e)
{
UnsafeThreadMethod("hello");
EvenUnsaferThreadMethod();
}
Y ahora los dos métodos.
private void UnsafeThreadMethod(string text)
{
toolStripLabelRssFeedData.Text = text;
}
private void EvenUnsaferThreadMethod()
{
panelLoading.Visible = true;
}
No entiendo por qué UnsafeThreadMethod
no arroja la siguiente excepción pero EvenUnsaferThreadMethod
hace.
Operación de cruce de hilos no válida: controle 'panelLoading' al que se accede desde un hilo que no sea el> thread en el que se creó.
De acuerdo con el mensaje es porque toolStripLabelRssFeedData
se creó en el mismo hilo pero no lo era.
Pensé que no puedo llamar a los controles creados por el hilo principal y tengo que usar el evento ProgressChanged
. ¿Que esta pasando?
Y tengo una segunda pregunta. ¿Cuál es la ventaja de hacerlo así cuando puedo usar ProgressChanged
? ¿Que debería hacer?
private void EvenUnsaferThreadMethod()
{
if (panelLoading.InvokeRequired)
{
panelLoading.Invoke(new MethodInvoker(() => { EvenUnsaferThreadMethod(); }));
}
else
{
panelLoading.Visible = true;
}
}
Creo que esta respuesta aborda lo que el OP estaba preguntando, y por eso una llamada que parecía claramente insegura no arrojaba una excepción. Todo gira en torno al hecho de que ToolStripLabel no se deriva de Control y, por lo tanto, no se está comprobando la seguridad de las hebras. Simplemente funciona, pero como otros han señalado, no puedes contar con eso para ser verdad para siempre. –