私は代表者があまり得意ではなく、内部で何が起こっているのかわかりません。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
エラーを回避する適切な方法は、すべての状況を処理するという意味で、できれば簡潔で読みやすいという意味で何ですか?