¿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?

Respuestas a la pregunta(1)

Su respuesta a la pregunta