我不太擅长代表,我不明白幕后发生的事情。从cross thread operation
不同线程访问 UI 项目时出现错误。
我想做的是在一个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
错误的正确方法,从某种意义上说,它处理所有情况,最好是简洁易读?