Самый краткий и правильный способ избежать ошибки операции с несколькими потоками?
Я не очень хорош в делегатах, и я нене понимаю, чтопроисходит под капотом. Я получаю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
ошибка, в том смысле, что она обрабатывает все ситуации, желательно краткие и удобочитаемые?