在等待UDP接收时,我的定时器缓冲区会溢出吗?

时间:2015-11-16 01:37:53

标签: c# wpf udpclient system.timers.timer

我正在编写一个软件,它将从UDP数据包接收数据,然后将其写入文件。这是一个示例代码,我作为控制台应用程序编写,以测试UdpClient类。

while(!done)
{
Console.WriteLine("Receiving");
byte[] bytes = listener.Receive(ref groupEP);
Console.WriteLine("Received");
}

我发现如果没有收到UDP数据包,while循环将在Receive(ref groupEP)函数处暂停。只有当收到UDP数据包时,才会继续打印"收到"。

但是对于实际程序(WPF),为了节省资源,我使用的是计时器。目前它可以正常更新接口和文件,但我一直想知道如果每隔100ms调用一次定时器会发生什么,而UDP报文每1秒钟只接收一次(假设我不知道什么时候会收到UDP,所以我选择100ms)。 这会导致每1秒9次冗余定时器调用,这会导致溢出吗?目前该应用程序适用于此场景,但我想了解为什么以及是否有任何可能的后果。

1 个答案:

答案 0 :(得分:0)

这个问题的边界“过于宽泛”。你提出了很多不同的问题。那就是说,试图让事情变得简短......

计时器的行为取决于您实际使用的计时器。如果您正在使用DispatcherTimer并从计时器事件处理程序调用{​​{1}},那么您将不会获得冗余计时器事件,因为您将阻止UI线程。这实际上并不好,但至少它不会导致过多的计时器事件。

如果您正在使用其他类型的计时器,那么是...在完成前一个操作之前发出新的Receive()操作将导致越来越多的尚未完成的Receive()操作。您可以通过将套接字置于非阻塞模式来解决此问题,但这会打开一整套新的蠕虫。所以......


实际上,您根本不应该使用阻塞Receive()方法,也不应该使用任何与I / O相关的计时器。您应该使用Receive()的异步版本,例如ReceiveFrom(),您可以将其包含在BeginReceiveFrom()中,以便您可以使用Task.Factory.FromAsync()而不是处理回调。 (您应该使用await,以便您可以实际获取所收到的数据报的远程端点信息。

使用此技术时,您将使用ReceiveFrom()循环(如果使用await),或者在处理完成的操作时再次调用FromAsync()(如果您使用的是旧版本 - 风格回调机制)。这样,您可以一次只激活一个接收操作,但不会阻塞任何线程,因此无需使用计时器或其他机制来轮询套接字。

相关问题