如何使 UdpClient 非阻塞

Posted

技术标签:

【中文标题】如何使 UdpClient 非阻塞【英文标题】:How to make UdpClient non blocking 【发布时间】:2019-03-07 17:33:28 【问题描述】:

我是 Socket 编程和 C# 的新手。我正在尝试创建一个我正在使用 UdpClient 的应用程序。

但即使套接字上有数据,但有时Receive function 没有收到任何数据并进入阻塞状态。 只是为了防止这种情况发生阻塞,我使用了一个计数器。 接收函数在线程中。

main function 我创建了一个计数器

int count = 0;
bool ret = IsDataReceived();
while(!ret && count < 30)

  ret = IsDataReceived();
  count++;


if(count>= 30)

thread.abort();

udpclient.close();

else

Console.WriteLine("Data Received");

我现在正在这样做,但我想知道如何使UdpClient 成为非阻塞的。

提前致谢。

【问题讨论】:

C# UDP Socket client and server的可能重复 从不使用Thread.Abort 方法。它仅适用于特殊情况。如果你不知道这些情况,那你肯定不需要Thread.Abort @dymanoid 好的先生,但我没有找到其他方法 【参考方案1】:

如果你正在使用,我不知道你的函数 IsDataReceive 是如何编写的:

UdpClient.Receive

此操作阻塞,直到套接字返回消息

如果您不想进行阻塞操作,可以使用:

UdpClient.ReceiveAsync

【讨论】:

IsDataRecived 返回 bool 值,如果接收到的数据为真。您可以发布 ReceiveAsync 的示例代码 你有一个漂亮的样本:docs.microsoft.com/fr-fr/dotnet/framework/network-programming/… 如果您的原始问题已解决,请记住接受并投票,如果您有其他问题,请提出新问题:***.com/help/someone-answers

以上是关于如何使 UdpClient 非阻塞的主要内容,如果未能解决你的问题,请参考以下文章

如何使数据访问对象非阻塞?

(显然)Gracefully Closed UDPClient 使套接字阻塞

如何使 Ignite 像使用 TcpDiscoveryMulticastIpFinder 一样使用 TcpDiscoveryVmIpFinder 进行非阻塞行为?

利用tornado使请求实现异步非阻塞

如何将 TCP 套接字更改为非阻塞?

使 WebSocket 发送非阻塞