2013-05-15 61 views
0

我试图在Windows窗体中创建一个UDP侦听器。我想听一个地址和端点,并希望在窗体上的文本框中显示收到的文本。我试图从不同的角度攻击这件事。C#中的UDP侦听器#

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

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

+2

有一些代码可以比描述代码的文本块更好。 – weston

回答

1

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

1

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

+0

对于像这样的BeingInvoke用法的示例,谷歌“线程编组用户界面”,但不在引号中。 – AaronLS