gpt4 book ai didi

C#.Net UdpClient 接收事件

转载 作者:行者123 更新时间:2023-11-30 13:37:23 24 4
gpt4 key购买 nike

我想知道是否有任何方法可以在我的 UdpClient 接收数据时以某种方式触发事件? (System.Net.Sockets.UdpClient)

我尝试覆盖它的 UdpClient.Receive 但我不能根据 this因为可覆盖成员必须标记为虚拟或抽象。

我目前的做法是在特定时间间隔在 Threading.Timer 上运行 TimerCallback 来获取我的数据,但我更愿意在传入数据到达时接收它,而不是重复获取它。

关于我如何执行此操作或我是否必须按时间间隔手动接收任何建议、建议或指示?

最佳答案

重写 Receive 方法对您没有任何帮助 - 它不是 UDP 客户端接收数据时调用的方法,它是需要时调用的方法等待传入数据。

但是,Receive 方法会阻塞。这意味着您实际上不必每隔一段时间检查一次——您可以简单地检查一个(几乎)无限循环。只需在不同的线程中执行即可。

void Loop(CancellationToken token)
{
var remoteEP = default(IPEndPoint);

while (!token.IsCancellationRequested)
{
var data = client.Receive(ref remoteEP);

yourForm.Invoke(DataReceived, data);
}
}

当然,由于这是简单的 I/O,因此不需要占用线程来执行此操作 - 您可以使用异步 I/O:

public Task Loop(CancellationToken token)
{
using (UdpClient client = new UdpClient(80))
{
while (!token.IsCancellationRequested)
{
var data = await client.ReceiveAsync();

// Process the data as needed
}
}
}

在 winforms 或 WPF 应用程序中,这将自动工作 - 您只需在 btnStart_Click 事件处理程序中使用此代码,它将使您的 UI 在等待数据时保持响应背景;每当数据返回时,它将在 UI 线程上执行其余代码(根据需要处理数据)——无需手动创建任何线程或处理调度。

当然,处理终止有些棘手,但对于 UDP 来说总是很棘手 - 基本上,您要么必须使用支持取消的更手动的方式(ReceiveAsync 只是一个包装器BeginReceiveEndReceive 不支持取消),或者你会使用设置取消 token 然后向自己发送一个 0 长度数据包的老技巧(导致 Receive 调用结束并返回零长度字节数组)。

关于C#.Net UdpClient 接收事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23359784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com