¿La forma más concisa y adecuada de evitar un error de operación de rosca cruzada?
No soy muy bueno con los delegados y no entiendo lo que está sucediendo. Me sale elcross thread operation
error al acceder a los elementos de la interfaz de usuario desde un hilo diferente.
Lo que quiero hacer es escribir una función genérica en unUtility
clase para que pase cualquier método / bloque de código a la función. Puedo hacerlo de muchas maneras como:
delegate void UpdateGui(Control c, Action action);
public static void Do(Control c, Action action)
{
try
{
if (c.InvokeRequired)
{
UpdateGui updaterdelegate = new UpdateGui(Do);
c.TopLevelControl.Invoke(updaterdelegate, new object[] { c, action });
}
else
action();
}
catch (Exception ex)
{
//throw ex;
}
}
public static void Do(Control c, Action action)
{
try
{
if (c.InvokeRequired)
{
c.TopLevelControl.Invoke((Action)delegate { Do(c, action); });
}
else
action();
}
catch (Exception ex)
{
//throw ex;
}
}
public static void Do(Control c, Action action)
{
try
{
if (c.InvokeRequired)
{
c.TopLevelControl.Invoke(action);
}
else
action();
}
catch (Exception ex)
{
//throw ex;
}
}
public static void Do(Control c, Action action)
{
try
{
if (c.InvokeRequired)
{
c.TopLevelControl.Invoke(new MethodInvoker(() => action()));
}
else
action();
}
catch (Exception ex)
{
//throw ex;
}
}
public static void Do(Control c, Action action)
{
try
{
if (c.InvokeRequired)
{
c.TopLevelControl.Invoke(new MethodInvoker(delegate { action(); }));
}
else
action();
}
catch (Exception ex)
{
//throw ex;
}
}
public static void Do(Control c, Action action)
{
try
{
if (c.InvokeRequired)
{
c.TopLevelControl.Invoke((MethodInvoker)delegate { action(); });
}
else
action();
}
catch (Exception ex)
{
//throw ex;
}
}
Creo que los enfoques 1 y 2 son esencialmente iguales, y 4, 5 y 6 también. Mis preguntas son:
¿Cuál es la diferencia entre los enfoques (1 y 2), 3 y (4, 5 y 6)? Quiero decir, ¿cuáles serían los casos en que uno maneja / cuida a otro que no?
¿Cuál es la forma correcta de evitarcross thread operation
error, en el sentido en que maneja todas las situaciones, preferiblemente conciso y legible?