私のいくつかのプロジェクトでは、標準の .NET イベントよりも少し強力なものが必要であることが明らかになりました。
基本的に、関心のあるコンポーネントが変更されたときに、特定のサブスクライバーにコールバック (イベント) を発生させる、メッセージ ポンプ内のオプションが必要です。
これは、あるプロジェクトの特定の I/O 変更状態 (例: ボタンを閉じる接点) であったり、別のプロジェクトで特定の MAC アドレスのワイヤレス イーサネットから受信したメッセージである可能性があります。
私の現在の考え方は、ディクショナリと各アドレスに対するデリゲートのリストを使用することです (この例の場合)。
これはまだデバッグしていませんが、次の内容は正しいですか?
class CustomSubscription
{
public delegate void DataReceivedHandler(object sender, DataReceivedEventArgs args);
public class DataReceivedEventArgs : EventArgs
{
public byte[] data;
}
private readonly Dictionary<int, List<DataReceivedHandler>> _subscribers;
public CustomSubscription()
{
_subscribers = new Dictionary<int, List<DataReceivedHandler>>();
}
public void AddSubscriber(int address, DataReceivedHandler callback)
{
if (false == _subscribers.ContainsKey(address))
{
_subscribers.Add(address, new List<DataReceivedHandler>());
}
_subscribers[address].Add(callback);
}
public void RemoveSubscriber(int address, DataReceivedHandler callback)
{
if (false == _subscribers.ContainsKey(address))
{
return;
}
if (_subscribers[address].Contains(callback))
{
_subscribers[address].Remove(callback);
}
}
public void HandleIncommingData(int address, object sender, byte[] payload)
{
if (false == _subscribers.ContainsKey(address))
{
// Nothing subscribed - take no action
return;
}
// Raise callbacks with all subscribers
foreach (DataReceivedHandler callback in _subscribers[address])
{
callback(sender, new DataReceivedEventArgs
{
data = payload
});
}
}
}