以下のようにUDPClientを使用しています
dim c = New UDPClient(port)
client.CLient.ReceiveTimeout = 1
await client.ReceiveAsync()
ただし、タイムアウトを設定しても、待機は終了またはスローしません。これは正常な動作ですか?
以下のようにUDPClientを使用しています
dim c = New UDPClient(port)
client.CLient.ReceiveTimeout = 1
await client.ReceiveAsync()
ただし、タイムアウトを設定しても、待機は終了またはスローしません。これは正常な動作ですか?
Socket.ReceiveTimeout に関する MSDN ライブラリの記事で明示的に言及されています。
同期受信呼び出しがタイムアウトするまでの時間を指定する値を取得または設定します。
強調が追加されました。ReceiveAsync() を使用すると、同期受信の逆を行っています。回避策は、呼び出しの前に開始し、後で停止する System.Timers.Timer を使用することです。Elapsed イベント ハンドラーでソケットを閉じて、ReceiveAsync() メソッドが ObjectDisposed 例外で終了するようにします。
はい。の非同期メソッドSocket
はタイムアウトを実装しません。非同期操作でタイムアウトが必要な場合は、自分で作成する必要があります (たとえば、 と を使用Task.Delay
) Task.WhenAny
。
私は最近この問題を抱えていましたが、これが私がそれを解決した方法です:
async Task Listen(IPEndPoint ep, int timeout)
{
using (var udp = new UdpClient(ep))
{
var result = await Task.Run(() =>
{
var task = udp.ReceiveAsync();
task.Wait(timeout);
if (task.IsCompleted)
{ return task.Result; }
throw new TimeoutException();
});
Receive(result); // use the result
}
}