我需要使用哪些线程工作方法?

时间:2012-03-13 22:21:42

标签: c# wpf multithreading threadpool

我有音频播放器应用程序(c#.NET 4.0 WPF)从网络获取音频流并播放它。该应用程序还显示波形和频谱,并将音频保存到本地磁盘。它还做了一些其他的事情。

我的问题是当我从网络上收到一个新的字节数据包并且我需要播放它们(并且可能将它们写入本地磁盘等)时,我是否需要使用线程?我试着用主线做所有的事情,似乎运作良好。

我可以使用threadpool来处理我在连接中收到的每个字节数据包。这是一种合理的方法吗?

2 个答案:

答案 0 :(得分:1)

为此,您可以使用Task Parallel Library (TPL)。任务并行库(TPL)是.NET Framework版本4中System.Threading和System.Threading.Tasks名称空间中的一组公共类型和API .TPL的目的是通过简化过程使开发人员更高效向应用程序添加并行性和并发性。 TPL动态地扩展并发度,以最有效地使用所有可用的处理器。此外,TPL处理工作的分区,ThreadPool上的线程调度,取消支持,状态管理和其他低级细节。

另一个选项(如果您正在执行的操作已经足够长时间运行)是BackgroundWorker class。 BackgroundWorker组件使您能够在与应用程序的主UI线程不同的线程上异步(“在后台”)执行耗时的操作。要使用BackgroundWorker,只需告诉它在后台执行哪些耗时的工作方法,然后调用RunWorkerAsync方法。当worker方法异步运行时,调用线程继续正常运行。方法完成后,BackgroundWorker通过触发RunWorkerCompleted事件来警告调用线程,该事件可选地包含操作的结果。如果您有许多操作要按顺序进行,这可能不是您的最佳选择。

下一个被TPL取代的替代方案是Thread Class。这在TPL上并不那么容易使用,你可以使用TPL来完成所有事情,因为你可以使用Thread Class(差不多),而且TPL更加用户友好。

我希望这会有所帮助。

答案 1 :(得分:0)

我建议使用2个线程:一个是从web下载数据包并将它们放入队列(如果使用异步下载操作,它可以是UI线程),而在另一个线程中,您正在分析队列并处理来自它的数据包。