私は外部クラスから標準の.Netイベントを受け取るクラスを持っています。 これらのイベントには、イベントを同期させるために使用できるアドレスプロパティがあります(他の多くのプロパティに加えてもちろん)。何かを取得して正しいイベントを待つメソッドを作成できるはずですGetメソッドのイベントからデータを返します。非同期イベントの同期
しかし、私はC#の同期にかなり新しく、あなたのうちの誰かが私を助けてくれることを願っていました。
- 誰かがメソッドがイベントを待つが、同じアドレス(または、それまでのタイムアウトする)
- イベントをチェックして受信されたことを
DoAsynchronousToSynchronousCall
- を呼び出します。以下は、私が達成したいもののため、多少の擬似コードであります現在のすべての要求に対してそれは同じアドレスで要求を見つけた場合、
DoAsynchronousToSynchronousCall
は返信が DoAsynchronousCall
を到着した知らせを取得(または取得)返事をし、私は私のように感じる
public class MyMessage
{
public string Address { get; set; }
public string Data { get; set; }
}
public Main
{
externalClass.MessageReceived += MessageReceived;
}
public void MessageReceived(MyMessage message)
{
MyMessage request = _requestQueue.FirstOrDefault(m => m.Address = message.Address);
if (request != null)
{
// Do something to let DoAsynchronousToSynchronousCall() know the reply has arrived
}
}
private List<MyMessage> _requestQueue = new List<MyMessage>();
public MyMessage DoAsynchronousToSynchronousCall(MyMessage message)
{
_requestQueue.Add(message);
externalClass.Send(message);
// Do something to wait for a reply (as checked for above)
MyMessage reply = WaitForCorrectReply(timeout: 10000);
return reply;
}
、呼び出し元に返しますasync
とawait
を使用する機会が紛失しています(まだ私にはわかりません)。上記の情報に基づいて私が達成しようとしていることを理解できることを願っています。
はい、しかし、複数の発信者は 'DoAsynchronousToSynchronous'を呼び出す場合どのように扱うのでしょうか? 1つの「ManualResetEvent」だけが1人の発信者に適しているのではないでしょうか? – GTHvidsten
リセットイベントを 'MyMessage'に追加して、それぞれが独自のコピーを取得するようにしました –
@ ScottChamberlainの説明のおかげで、私は' ManualResetEvent'で動作させることができました:) – GTHvidsten