我正在尝试在Windows窗体中创建UDP侦听器。我想听地址和端点,并希望在表单上的文本框中显示收到的文本。我试图从不同角度对此进行攻击。
我的一个尝试是尝试使用BackgroundWorker来允许侦听器代码继续运行,同时仍然可以在UI线程中进行控制。当监听器继续监听时,我想继续添加发送到多行文本框的ascii数据(使用Visual Studio 2010和C#)。我在表单中添加了BackgroundWorker,因此我可以启动和停止监听器。我可以从发件人客户端接收测试并将其显示在MessageBox中,但是在使用相同文本更新表单上的文本框时遇到了问题(这是我实际想要做的)。
我尝试过的另一个角度是尝试堆栈溢出中的帖子中的代码,它使用UdpClient调用带有AsyncCallback的BeginReceive方法。在该示例中,回调使用传入的UdpClient调用EndReceive方法,获取数据,然后使用Console.WriteLine将其打印出来。我尝试了这段代码,尝试将收到的文本添加到表单上的文本框中,但无济于事。有没有办法使用BackgroundWorkder或UdpClient在表单上的文本框中显示接收的文本,或者我应该调查使用单独的线程为此或可能以其他方式。没有做任何多线程程序,我在这方面有点新手。任何帮助,将不胜感激。谢谢。
答案 0 :(得分:1)
您可能接近BackgroundWorker的实施;你只需要确保后台线程永远不会尝试更新UI。您必须移动代码以将文本框更新为附加到BackgroundWorker的ProgressChangedEventHandler。收到消息时,更新缓冲区(使用锁保护)并调用ReportProgress方法。 ReportProgress方法将调用UI线程上的ProgressChangedEventHandler,它可以根据缓冲区中的内容更新文本框。
答案 1 :(得分:1)
最好的方法是您尝试过的异步读取。这基本上与使用后台工作程序完全相同,但是库为您完成所有工作。棘手的一点是您的数据接收事件是在工作线程上调用的,因此要更新UI,您需要将控制权转移回来到ui线程。这可以通过在任何UI元素(窗体或控件)上使用'BeginInvoke'来在正确的线程上执行更新代码来完成。如果你对此进行搜索,你会发现很多例子。