GUI与另一个线程中的套接字

时间:2010-02-23 13:51:45

标签: c#

我想创建一个必须从套接字中提取数据的WinForm应用程序。

我想将套接字中的代码读取放在一个单独的线程中,我知道InvokeRequired/BeginInvoked模式。

考虑到WinForm场景,哪种类型的C#线程最适合我的目的?完全致力于从套接字或其他类型(如System.Threading.Thread)读取数据的公共BackgroundWorker是否足够?或者我应该考虑别的什么?

3 个答案:

答案 0 :(得分:2)

Thread workerThread = new Thread();
// do threadstart parameters or whatever
workerThread.IsBackground = true;
workerThread.Start();

这应该足够了......如果这是一个问题,你甚至可以设置它的优先级。

我并不特别关心BackgroundWorker。即使事件有用,我也不需要帮助。我发现它有限,因为我使用了很多异步方法(Action / Func)。

由于MSDN使用后台工作者声明了该过程:

  

要设置后台操作,请为DoWork事件添加事件处理程序。叫你耗时   此事件处理程序中的操作。要启动该操作,请调用RunWorkerAsync。接收通知   进度更新,处理ProgressChanged事件。在操作时接收通知   已完成,处理RunWorkerCompleted事件。

使用System.Threading.Thread似乎要简单得多。

答案 1 :(得分:1)

您可以使用APM模式,即

 mySocket.BeginReceive(..., myCallBack);

但这不是我最喜欢的模式。我会使用ThreadPool,可能通过BackgroundWorker。

答案 2 :(得分:0)

这个线程运行了很长时间吗?如果你需要它运行很长时间,如果你不需要直接与GUI交互(可能将数据缓存到缓冲区),那么我会使用System.Threading.Thread。我一直在使用BackgroundWorker,并发现,虽然它允许您通过其事件更新GUI,但它使用.NET线程池。线程池具有有限数量的线程可用,因此如果您需要通过BeginInvoke使用Windows Workflow或许多委托,则可能会通过占用过多的线程池线程来损害应用程序性能。