自分のプログラムにリスナーの登録時に、それが既に呼び出されているかどうかをチェックしたい場合は特別な種類のデリゲートを作成したいのですが、そうであれば即座にサブスクライブするリスナーを呼び出します。イベントが既に呼び出された場合、登録されたリスナーを登録するとすぐにそれを呼び出すイベントを作成する方法はありますか? (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();
}
これはうまく動作しますが、私は再利用できる汎用的なイベントを作成する方法を探しています - このため、私はこの動作を使用するたびに書き込むコードがたくさんあります。
ハンドラがない場合を処理するには、 '_someEvent.Invoke();'が '_someEvent?.Invoke();'でなければなりません。また、複数のスレッドが呼び出している場合、このコードは正しく動作しません。おそらくそれはあなたが扱う必要がある状況ではなく、一度にこのオブジェクトに作用するスレッドは1つだけです。あれは正しいですか? – Servy
@セイビーそれは半擬似コードでした - 私はこの事象を複数のイベントで発生させ、スレッドの安全性は問題ではない場合、私が再利用可能な方法でこれをどのように達成できるかについて詳しく質問します。 – Ron
はハンドルを削除しています実際に必要なのは? – Servy