2016-09-23 1 views
1

を上げて対呼び出す、私は、マルチスレッドプログラムで生成するイベントに対処するために、このルーチンを使用していた。(私はどこかでそれを見つけましたが、どこ覚えていないことができます):C#のイベントの作成:C#6前

public static object Raise(this MulticastDelegate multicastDelegate, object sender, EventArgs e) 
    { 
     object retVal = null; 

     MulticastDelegate threadSafeMulticastDelegate = multicastDelegate; 
     if (threadSafeMulticastDelegate != null) 
     { 
      foreach (Delegate d in threadSafeMulticastDelegate.GetInvocationList()) 
      { 
       var synchronizeInvoke = d.Target as ISynchronizeInvoke; 
       if ((synchronizeInvoke != null) && synchronizeInvoke.InvokeRequired) 
        retVal = synchronizeInvoke.EndInvoke(synchronizeInvoke.BeginInvoke(d, new[] { sender, e })); 
       else 
        retVal = d.DynamicInvoke(sender, e); 
      } 
     } 
     return retVal; 
    } 

ので、私がしなければならなかったすべては、私は新しいが、それが何か使用していた知っている、C#6で今

Eventname.Raise(...、...)

た: EVENTNAME .Invokeを(.. )。

Raise()と違って動作するか、同じものなので、すべてのイベント作成をInvokeに変更する必要がありますか?

答えて

3

最初にその方法を使用してはいけません。それはあまりにも複雑です。代わりに、このようなものはもっと良かったはず:

public static void Raise(this Delegate handler, object sender, EventArgs e) 
{ 
    if (handler != null) 
    { 
     handler.DynamicInvoke(sender, e); 
    } 
} 

あなたのイベント調達のコードを変更する必要があるかどうかについては、私はノーと言うだろう。あなたが完全に良いコードを置き換えるあなたのコードベース全体を殺すために多くの時間を持っていない限り、そうではありません。

あなたはになりますか?は現在のRaise()メソッドを修正しています。 の新しいコードでは、新しいC#6の方法(つまり、MyEvent?.DynamicInvoke(this, EventArgs.Empty))を書くことができます(これは、余分なメソッド呼び出しを除いて、上記を使用してMyEvent.Raise(this, EventArgs.Empty)と同じものになります)。

+0

コメントありがとうございました。 Raise()コードを変更します。助けてくれてありがとう。 – Tony

関連する問題