前提
C#のTaskを使用して、通信クライアントクラス(以下Agent)を実装中です。
Agentは、一定間隔でサーバに対して通信を行うループになっており、特定の条件でイベントを通知します。
数は確定していませんが、複数のインスタンスを立ち上げてそれぞれ別の相手と通信を行う想定です。
実現したいこと
メインクラスでAgentのインスタンスを起動し、イベントを受け取って処理を行うといったことをやりたいのですが、
そういった場合に、それぞれのAgentでイベントの発生するタイミングが被った場合には、いずれかのイベントが潰されてしまうのでしょうか?また、そういった場合のベストプラクティスがあれば教えていただきたいです。
該当のソースコード
main.cs
C#
1public class Main 2{ 3 public async Task void Main() 4 { 5 var agent1 = new Agent(); 6 agent1.SampleEvent += Agent_SampleEvent; 7 8 var agent2 = new Agent(); 9 agent2.SampleEvent += Agent_SampleEvent; 10 11 _ = agent1.Comm(); 12 _ = agent2.Comm(); 13 } 14 15 void Agent_SampleEvent() 16 { 17 // イベント発生時に走る処理 18 } 19} 20
Agent.cs
C#
1public class Agent 2{ 3 public event Action<object, EventArgs> SampleEvent 4 5 public async Task Comm() 6 { 7 // ループでサーバに通信を行う 8 // 特定の条件でAgentの呼び出し元クラスにイベントを通知する 9 } 10} 11
補足情報(FW/ツールのバージョンなど)
.NET 6.0
C#10.0
> タイミングが被った場合には、いずれかのイベントが潰されてしまう
とはどういう意味でしょうか?
「イベントを通知する」が各 Task(個別のスレッド)で実施されるなら単に「複数のスレッドがAgent_SampleEvent()を実施している状態」になるだけな気がするので,どういう問題を想定されているのかがわかりません.
→なので,「イベントを通知する」のところをコメントだけでなく簡易的なコードで示した方が話が明確になってよいではないでしょうか.
どのイベントハンドラが呼ばれるかはインスタンス毎に別々の管理となっているので
各インスタンスがほぼ同時にイベントが発生したとしても潰れることはないはずです。
あとevent Action<object, EventArgs>と定義しているのにイベントハンドラが
void Agent_SampleEvent()と定義してあるのはおかしいのでは?
>>fana 様
>>「イベントを通知する」が各 Task(個別のスレッド)で実施されるなら単に「複数のスレッドが>>Agent_SampleEvent()を実施している状態」になる
>>YAmaGNZ 様
>>どのイベントハンドラが呼ばれるかはインスタンス毎に別々の管理となっているので
>>各インスタンスがほぼ同時にイベントが発生したとしても潰れることはない
コメントありがとうございます。
各TaskからAgent_SampleEventを同時にコールするのは良くないのではと考えていたのですが、そうではないのですね。思い違いでした。ありがとうございます。
回答1件
あなたの回答
tips
プレビュー