我想创建一个必须从套接字中提取数据的WinForm应用程序。
我想将套接字中的代码读取放在一个单独的线程中,我知道InvokeRequired/BeginInvoked
模式。
考虑到WinForm场景,哪种类型的C#线程最适合我的目的?完全致力于从套接字或其他类型(如System.Threading.Thread
)读取数据的公共BackgroundWorker
是否足够?或者我应该考虑别的什么?
答案 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或许多委托,则可能会通过占用过多的线程池线程来损害应用程序性能。