繁体   English   中英

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

[英]How to create indefinite Background Threads in a loop in C#.NET

我有一个循环,需要创建一个不确定的和不确定数量的背景线程。 然后,这些线程将简单地运行到完成,但其中一些线程可能需要取消。

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

我的第二个想法只是将我的新值分配给数组中的一个元素(array [i] = new BackgroundWorker()),但这不会使自己不确定的线程数量。

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

两句话-一分,一分。

首先,TPL似乎可以满足您设定的目标。 使用Task.Factory.StartNew() ,您将能够产生任意数量的将在后台线程上运行的操作。 此外,使用带有CancellationToken的重载,您可以按期望的程度取消操作。 请注意,任务不等同于线程-默认情况下,任务在ThreadPool线程中运行(顺便说一下,后台工作程序也是如此)。 您的任务很有可能最终会进入队列,等待池化线程可用。

第二,更大的评论。

您声称您将拥有数量不确定且不确定的工作项。 您将为每个项目生成一个线程使我有点前卫-线程并不便宜,并且如果您有大量的工作项目,则可以通过天真地启动新线程来饿死您的进程。

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

编辑以回应评论

TCP连接的情况几乎是我在上面写第二条评论时所想的。 在这种情况下,您正在考虑有限的OS资源(即开放套接字)的潜在无限消耗。 希望您能研究非阻塞I / O。 这个MSDN页面记录了从套接字异步读取的内容,并且这一页讨论了.NET中更大的异步编程模型。

对于可伸缩的TCP服务,关于SO的讨论已经很好:请细心阅读

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM