0

我正在尝试在 Windows 窗体中创建一个 UDP 侦听器。我想监听地址和端点,并希望在表单的文本框中显示接收到的文本。我试图从不同的角度来解决这个问题。

我的尝试之一是尝试使用 BackgroundWorker 来允许侦听器代码继续运行,同时仍然可以控制 UI 线程。当听众继续收听时,我想继续添加发送到多行文本框的 ascii 数据(使用 Visual Studio 2010 和 C#)。我在表单中添加了一个 BackgroundWorker,所以我可以启动和停止监听器。我可以从发件人客户端接收测试并将其显示在 MessageBox 中,但是无法使用相同的文本更新表单上的文本框(这是我真正想要做的)。

我尝试过的另一个角度是尝试堆栈溢出此处的帖子中的代码,该代码使用 UdpClient,该 UdpClient 使用 AsyncCallback 调用 BeginReceive 方法。在示例中,回调使用传入的 UdpClient 调用 EndReceive 方法,获取数据,然后使用 Console.WriteLine 将其打印出来。我尝试了该代码,尝试将接收到的文本添加到表单上的文本框中,但无济于事。有没有办法使用 BackgroundWorkder 或 UdpClient 在表单上的文本框中显示接收到的文本,或者我应该为此使用单独的线程或可能以其他方式进行调查。没有做过任何多线程程序,我在这方面有点新手。任何帮助,将不胜感激。谢谢。

4

2 回答 2

1

最好的方法是您尝试过的异步读取。这基本上与使用后台工作人员做同样的事情,但库会为您完成所有工作。棘手的一点是您的数据接收事件是在工作线程上调用的,因此要更新 UI,您需要将控制权转移回到ui线程。这可以通过在任何 UI 元素(表单或控件)上使用“BeginInvoke”来在正确的线程上执行更新代码来完成。如果您对此进行搜索,您会发现大量示例。

于 2013-05-15T18:00:00.237 回答
1

您可能已经接近您的 BackgroundWorker 实现了;您只需要确保后台线程永远不会尝试更新 UI。您必须移动代码以将文本框更新为附加到 BackgroundWorker 的 ProgressChangedEventHandler。当您收到消息时,更新缓冲区(受锁保护)并调用 ReportProgress 方法。ReportProgress 方法将调用 UI 线程上的 ProgressChangedEventHandler,它可以根据缓冲区中的内容更新文本框。

于 2013-05-15T15:55:49.780 回答