2014-10-16 43 views
0

我发现我很享受通过BackgroundWorkers异步运行代码的简单性。我通过例子或反复试验来了解自己的用途,陷阱,安全线程等,而不是理论,也许是我的致命弱点。如何创建一个后台工作者池?

我已经完成了我的研究,但有一件事我没有找到太多的话题,我如何有效地创建和使用一个BackgroundWorkers池?或者什么是更好的选择,就像使用BW一样简单?

我会说明我遇到的问题: 我有一个任务X,Y和Z,每一个都是密集的,因此它将挂起UI线程。我决定BW是答案,即使这个代码只执行一次。我学会了如何使用它们,以及一些安全的线程实践,并继续前进。很快我的代码看起来像:BW1,BW2,BW3等等。

然后我开始更加熟悉它们,并真正将代码放入可用于硬件监视或其他无限循环/总是运行项目的BW中。我仍遇到BW5,BW6 ....问题。

我发现创造性的方式来通过在调用RunWorkerAsynchronous()之前设置一个全局字符串变量来获得多用途BackgroundWorkers,然后我可以在BackgroundWorker内部嵌套If/Elses或开关以执行所需的代码关闭了我设置字符串变量的内容。但是,我觉得我只是在自我学习的极限内跳舞。

因此,谁能指导我通过创建线程/ BW中的池的概念,并根据需要在我的程序中使用它们,回收线程,而不是明确地建立每一个,然后有几十backgroundworkers的特定密集的目的去玩弄?

注:我不是一个很好的程序员,所以我正在寻找简单的功能示例或解释。任何和所有的帮助,但热切欢迎!

+0

你看过Tasks(TPL)和/或正规的ThreadPool吗? IIRC,如果需要用于更新WPF或Winforms UI的同步上下文,backgroundworker会很好,但它不完全灵活。 – x0n 2014-10-16 15:46:38

+0

你检查了[ThreadPool Class](http://msdn.microsoft.com/en-us/library/System.Threading.ThreadPool(v = vs.110).aspx?cs-save-lang = 1&cs-lang = csharp#code-snippet-1) – bansi 2014-10-16 15:46:58

+0

这是.NET 2.0还是更高? – 2014-10-16 15:48:03

回答

1

你不需要集中它们。它们在内部使用了ThreadPool,它已经是一个线程池。

Thread/threadpool or backgroundworker

+0

我明白这一点,然而,BackgroundWorker是明确的代码。有时候一次性放弃永远不会放弃,其他时间则永远不放弃。我如何避免宣布一打BW,当有些时候他们需要重新使用而其他人是“一次性”的? 我的想法告诉我创建一个HastTable /数组/列表的BW ...但我认为可能有更好的方法。 – HouseCat 2014-10-16 15:49:25

+0

那么,如果你正在创造几十个体重...你可能想重新思考你的方法:)使用类似TPL的东西,你会发现一个新的控制世界http://www.codeproject.com/Articles/747594/Understanding -Task-Parallelism-Framework-TPL-使用BW只是为了节省一天,从来没有想过要这样使用。 – vtortola 2014-10-16 15:56:30

+0

TPL是否会成为答案,还有很多工作要做......呃。 我实际上得到了建议BWs从微软开发。感谢您的帮助:) – HouseCat 2014-10-16 15:59:24

2

我强烈建议使用任务,实现你想要什么。这种管理从线程池中选择的线程,平衡多个内核等线程的所有的辛勤工作

,如果你具备的功能:

public void DoSomething() 
{ 
    //things happen here 
} 

然后你就可以使用启动任务:

var task = Task.Factory.StartNew(DoSomething); 

var task = new Task(DoSomething); 

你可以阅读更多的http://msdn.microsoft.com/en-us/library/dd537609(v=vs.110).aspx

+1

+1查看任务。它们非常灵活:可以使用“async/await”;他们支持链/继续和儿童任务;他们有一个高效的调度程序;他们支持取消;他们与'SynchronizationContext'搭配很好;如果你有一个长期运行的任务,你可以通过'TaskCreationOptions.LongRunning'来确保它获得它自己的线程并且不阻止新任务被调度。如果你正从一个像BackgroundWorker这样的高级构造中移动,这将比在ThreadPool上简单地执行作业更自然。 – 2014-10-16 16:08:20

+0

感谢您提供更多的信息,我希望我可以再使用几个月的代码,但现在看起来我必须“长大”并使用大男孩编程。 – HouseCat 2014-10-16 16:17:15