await UDPClient.ReceiveAsync with timeout

前端 未结 3 1806
南旧
南旧 2020-12-11 18:28

I\'m using UDPClient like below

dim c = New UDPClient(port)
client.CLient.ReceiveTimeout = 1
await client.ReceiveAsync()

However the await

相关标签:
3条回答
  • 2020-12-11 18:45

    Yes. The asynchronous methods on Socket do not implement the timeouts. If you need timeouts on asynchronous operations, you have to create them yourself (e.g., using Task.Delay and Task.WhenAny).

    0 讨论(0)
  • 2020-12-11 18:59

    It is explicitly mentioned in the MSDN Library article for Socket.ReceiveTimeout:

    Gets or sets a value that specifies the amount of time after which a synchronous Receive call will time out.

    Emphasis added. You are doing the opposite of a synchronous receive when you use ReceiveAsync(). The workaround is to use a System.Timers.Timer that you start before the call and stop afterwards. Close the socket in the Elapsed event handler so the ReceiveAsync() method terminates with an ObjectDisposed exception.

    0 讨论(0)
  • 2020-12-11 19:02

    I had this issue recently and this is how I solved it:

    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
        }
    }
    
    0 讨论(0)
提交回复
热议问题