我不是很擅長代表,我不知道發生了什麼。訪問來自其他線程的UI項目時,出現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; } }
我相信AP步驟1和2本質上是相同的,並且4,5和6也是如此。我的問題是:
什麼方法(1 & 2)之間的區別3和(4,5 & 6)?我的意思是,一個人處理/照顧其他人不會處理的情況是什麼?
什麼是避免
cross thread operation
錯誤的正確方法,從它的意義上來說,它處理所有的情況,最好是簡潔和可讀?
我更加困惑於'MethodInvoker' ..它代替'delegate','action','()=>'關鍵字做什麼特別的事情? – nawfal
@nawfal這只是另一個委託聲明。實際上,這與使用「操作」相同。 '=>'語法是一個lambda表達式,它是創建匿名方法的新語法(類似於'delegate {}',但語法更清晰)。 –