如何在C#.NET中的循环中创建不定的后台线程

时间:2012-03-23 05:31:39

标签: c# .net multithreading backgroundworker

我有一个循环,需要创建一个未指定和无限数量的后台线程。然后线程将简单地运行完成,但有些可能需要取消。

我最初计划通过声明一个backgroundWorker,将其添加到列表,然后重新启动BackgroundWorker以再次开始此过程来完成此操作。但是因为List.Add方法通过引用传入的对象运行,我认为当我新建原始BackgroundWorker时,List引用的线程将丢失(或更糟)。

我的第二个想法是简单地将我的新值分配给数组中的元素(array [i] = new BackgroundWorker()),但这并不适合无限量的线程。

有没有人有任何关于管理这些单独线程的好方法的建议?提前谢谢。

1 个答案:

答案 0 :(得分:6)

两条评论 - 一条微观,一条宏观。

首先,似乎TPL符合您的既定目标。使用Task.Factory.StartNew(),您将能够生成将在后台线程上运行的任意数量的操作。此外,使用带有CancellationToken的重载,您可以取消操作,使其达到您希望的程度。请注意,Task不等同于Thread - 默认情况下,Tasks在ThreadPool线程中运行(顺便说一下,后台工作者也是如此)。完全有可能你的任务最终会在一个队列中等待一个池化的线程变得可用。

其次,更大的评论。

您声称自己将拥有未指定且无限数量的工作项。你会为每个项目生成一个线程让我有点前卫 - 线程并不便宜,如果你有大量的工作项,你可以通过天真地开始新线程来使你的过程挨饿。

你能详细说明你需要对这些线程做些什么吗?我不知道什么构成了项目的工作项,但是具有固定数量线程的生产者/消费者设置完全有可能满足您的并行化需求。 .NET 4.0使System.Collections.Concurrent类变得简单。

编辑以回应评论

当我写上面的第二条评论时,TCP连接的情况几乎就像我在想的那样。在这种情况下,您正在考虑可能无限消耗有限的OS资源,即打开套接字。我希望您将研究非阻塞I / O. This MSDN page记录了来自套接字的异步读取,this one讨论了.NET中更大的异步编程模型。

对于可扩展的TCP服务,SO上已经存在一个很好的讨论:peruse at your pleasure