如何创建后台工作者池?

时间:2014-10-16 15:40:00

标签: c# multithreading backgroundworker

我发现我很享受通过BackgroundWorkers异步运行代码的简单性。我通过实例或试错来教导我自己的用途,陷阱,安全线程等,而不是理论,也许是我的阿基里斯脚跟。

我已经完成了我的研究,但有一件事我没有太多谈论,我怎样才能有效地创建和使用一群BackgroundWorkers?或者什么是更好的替代方案,就像使用BW一样简单?

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

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

通过在调用RunWorkerAsynchronous()之前设置全局字符串变量,然后我可以在BackgroundWorker中使用嵌套的If / Elses或Switch来执行基于所需的代码,我找到了创造性的方法来拥有多用途BackgroundWorkers。我将字符串变量设置为。但是,我觉得我只是在自我学习的极限上跳舞。

所以任何人都可以指导我完成创建一个线程/ BW的概念,并在我的程序中根据需要使用它们,回收线程而不是显式创建每个线程,然后有几十个后台工作者特定的密集目的来玩杂耍?

注意:我不是一个非常优秀的程序员,所以我正在寻找简单的功能实例或解释。我们热切欢迎任何和所有的帮助!

2 个答案:

答案 0 :(得分: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)

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

Thread/threadpool or backgroundworker