2016-12-07 2 views
0

自分のプログラムにリスナーの登録時に、それが既に呼び出されているかどうかをチェックしたい場合は特別な種類のデリゲートを作成したいのですが、そうであれば即座にサブスクライブするリスナーを呼び出します。イベントが既に呼び出された場合、登録されたリスナーを登録するとすぐにそれを呼び出すイベントを作成する方法はありますか? (C#)

私は、以下のものを使用してそれを達成することができましたアトミックそれを見て:

private bool _wasEventCalled; 
private event Action _someEvent; 

public event Action SomeEvent 
{ 
    add 
    { 
     if (value == null) 
     { 
      return; 
     } 

     // If already called, call immediatley 
     if (_wasEventCalled) 
     { 
      value(this); 
      return; 
     } 
     _someEvent += value; 
    } 
    remove 
    { 
     if (_someEvent == null) 
     { 
      return; 
     } 
     _someEvent -= value; 
    } 
} 


private void InvokeEvent() 
{ 
    _wasEventCalled = true; 
    _someEvent.Invoke(); 
} 

これはうまく動作しますが、私は再利用できる汎用的なイベントを作成する方法を探しています - このため、私はこの動作を使用するたびに書き込むコードがたくさんあります。

+0

ハンドラがない場合を処理するには、 '_someEvent.Invoke();'が '_someEvent?.Invoke();'でなければなりません。また、複数のスレッドが呼び出している場合、このコードは正しく動作しません。おそらくそれはあなたが扱う必要がある状況ではなく、一度にこのオブジェクトに作用するスレッドは1つだけです。あれは正しいですか? – Servy

+0

@セイビーそれは半擬似コードでした - 私はこの事象を複数のイベントで発生させ、スレッドの安全性は問題ではない場合、私が再利用可能な方法でこれをどのように達成できるかについて詳しく質問します。 – Ron

+0

はハンドルを削除しています実際に必要なのは? – Servy

答えて

0

説明しているのは、Task継続の動作の多かれ少なかれなので、Taskにピギーバックできます。注目すべきは

private TaskCompletionSource<bool> someEventSource = 
    new TaskCompletionSource<bool>(); 

public event Action SomeEvent 
{ 
    add 
    { 
     someEventSource.Task.ContinueWith(t => value?.Invoke()); 
    } 
    remove 
    { 
     throw new NotImplementedException(); 
    } 
} 


private void InvokeEvent() 
{ 
    someEventSource.TrySetResult(true); 
} 

、タスクが実際にハンドラを削除はサポートされていませんので、あなたはそれはあなたが持っているために重要だった場合は、独自のクラスを記述する必要があると思います。

+0

なぜそれがうまくいくのかわかりました。私たちはUnity3dを使っています。タスクなし)。さらに、私はデリゲートの+ =大会にとどまりたいと思っていました – Ron

+0

@Ronその後、あなた自身のクラスを作成する必要があります。これは難しくありません。基本的には、すでに実装されている実装を使用して、各操作を独自のメソッドにリファクタリングするだけです。 – Servy

+0

だから私はそれもやって、+と - 演算子をオーバーロードする。このアプローチの問題は次のとおりです。1.クラス2をインスタンス化する必要があります。イベントは、イベントの代理人ではなくクラスであるため、どこからでも呼び出すことができます。3. MSVSのインテリセンスはこのソリューションでうまく機能しません。 – Ron

関連する問題