use*_*447 1 .net c# multithreading backgroundworker
我有一个循环,需要创建一个未指定和无限数量的后台线程.然后线程将简单地运行完成,但有些可能需要取消.
我最初计划通过声明一个backgroundWorker,将其添加到列表,然后新建BackgroundWorker以再次开始该过程来完成此操作.但是因为List.Add方法通过引用传入的对象运行,我认为当我新建原始BackgroundWorker时,List引用的线程将丢失(或更糟).
我的第二个想法是简单地将我的newed值赋给数组中的元素(array [i] = new BackgroundWorker()),但这并不适合无限量的线程.
有没有人有任何关于管理这些单独线程的好方法的建议?提前致谢.
两条评论 - 一个微观,一个宏观.
首先,似乎TPL符合您的既定目标.使用Task.Factory.StartNew(),您将能够生成将在后台线程上运行的任意数量的操作.此外,使用带有CancellationToken的重载,您可以取消操作,使其达到您希望的程度.请注意,Task不等同于Thread - 默认情况下,Tasks在ThreadPool线程中运行(顺便说一下,后台工作者也是如此).您的任务完全有可能最终进入队列,等待池化线程变为可用.
第二,更大的评论.
您声称您将拥有未指定且无限数量的工作项.你会为每个项目生成一个线程让我有点前卫 - 线程并不便宜,如果你有大量的工作项,你可以通过天真地开始新的线程来使你的过程挨饿.
你能详细说明你需要用这些线程做什么吗?我不知道什么构成了项目的工作项,但是具有固定数量线程的生产者/消费者设置完全有可能满足您的并行化需求..NET 4.0使System.Collections.Concurrent类变得简单.
编辑回应评论
当我写上面的第二条评论时,TCP连接的情况几乎就像我在想的那样.在这种情况下,您正在考虑可能无限消耗有限的OS资源,即打开套接字.我希望您将研究非阻塞I/O. 这个MSDN页面记录了从套接字的异步读取,这个讲述了.NET中更大的异步编程模型.
对于可扩展的TCP服务,SO上已经存在一个很好的讨论:您可以随意阅读.
| 归档时间: |
|
| 查看次数: |
724 次 |
| 最近记录: |