1

UdpClient の作業中に新しい async/await コンストラクトを利用しようとしています。async/await とうまく連携する非同期メソッドがいくつかあります。

問題は、現在のリクエストを適切なレスポンスに接続する必要があるときに発生します。UdpClient からの応答は順序付けされていないため、次を使用してロジック全体を台無しにすることができます。

var response = await udpClient.ReceiveAsync();
// We might receive here a response
// that belongs to other request

以下の完全なソース:

// Here I am trying to provide unified message sending logic
private async Task<Response> SendMessageAsync(IPEndPoint destination, Message message)
{
    var stream = new MemoryStream();

    formatter.Serialize(stream, message);

    var buffer = stream.GetBuffer();

    // Here I am sending message 
    var numBytes = await udp.SendAsync(buffer, buffer.Length, destination);

    // Now I need to wait for response
    // but I can't just use:

    // var response = await udp.ReceiveAsync();

    // Because current receive operation might catch data that is subject to
    // another send message operation which has started some time before the
    // current one.

    // So how the question how is it possible to implement the following construct:

    // return await GetResponse(message.ConversationID);
}
4

1 に答える 1

2

応答を読んだ後、自分で一致させる必要があります。

asyncこれは/の制限ではなく、UDP の基本的な制限ですawait

メッセージを整理する必要がある場合は、TCP をお勧めします。TCP はそのために設計されました。

于 2012-06-23T13:31:35.570 に答える