Самый краткий и правильный способ избежать ошибки операции с несколькими потоками?

Я не очень хорош в делегатах, и я нене понимаю, чтопроисходит под капотом. Я получаюcross thread operation ошибка при доступе к элементам пользовательского интерфейса из другого потока.

Что я хочу сделать, это написать универсальную функцию вUtility класс, так что я могу передать любой метод / код блока функции. Я могу сделать это многими способами, такими как:

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;
    }
}

Я считаю, что подходы 1 и 2 по существу одинаковы, а также 4, 5 и 6. Мои вопросы:

Какие'Разница между подходами (1 & 2), 3 и (4, 5 и 6)? Я имею в виду, что было бы в случаях, когда один занимается / заботится о том, что другой не делает?

Какие'это правильный способ избежатьcross thread operation ошибка, в том смысле, что она обрабатывает все ситуации, желательно краткие и удобочитаемые?

Ответы на вопрос(1)

Ваш ответ на вопрос