1

for void メソッドを処理するジェネリック メソッドを作成するための解決策が思いつきませんInvokeRequired(戻り値については後で扱います)。私は次のようなことを考えていました:

// Probably not the best name, any ideas? :)
public static void CheckInvoke(this Control instance,
                               ,Action<object, object> action)
{
  if (instance.InvokeRequired)
  {
    instance.Invoke(new MethodInvoker(() => action));
  }
  else
  {
    action()
  }
}

次に、次のように書くことができます。

public partial class MyForm : Form
{
  private ThreadedClass c = new ThreadedClass();

  public MyForm()
  {
    c.ThreadedEvent += this.CheckInvoke(this
                                        ,this.MethodRequiresInvoke
                                        ,sender
                                        ,e);
  }
}

これは明らかにコンパイルされません。私はそれを完全に結び付けることができません。

4

2 に答える 2

2

Hans は正しいです。おそらく、このようなコードをラップしたくないでしょう。特に、どのスレッド アクションが発生しているかを判断する際にデバッグの問題が発生する可能性があるためです。つまり、これはあなたが望む署名になるでしょう:

public static class FormsExt
{
    public static void UnwiseInvoke(this Control instance, Action toDo)
    {
        if(instance.InvokeRequired)
        {
            instance.Invoke(toDo);
        }
        else
        {
            toDo();
        }
    }
}
于 2012-12-31T22:06:45.857 に答える
1

「object、object」のアクションパラメータを緩め(JerKimballが提案するように)、SafeInvokeという名前を付け、匿名デリゲートを介してイベントにアタッチします。

 c.ThreadedEvent += delegate
                        {
                           c.SafeInvoke(this.MethodRequiresInvoke);
                        };
于 2012-12-31T22:29:24.973 に答える