C#:更好的线程架构
我有兴趣从您那里得到一些关于什么是一个好的/更好的线程架构的想法,该架构尊重下面描述的规则:
-
线程必须在应用程序的生命周期中运行,如果有的话,处于睡眠/等待模式队列中没有要执行的工作。
-
线程必须具有 BelowNormal 优先级(这消除了使用 ThreadPool 的可能性)。
-
线程必须在任务完成后向主线程提供反馈。
-
线程将监视队列
以获得更多要执行的作业。
我正在使用 .Net Framework 4.0
让我知道你的想法:)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
当我需要实现自己的多线程处理时,我通常使用这样的东西:
When I need to implement my own multi-threaded processing, I usually use something like this:
这似乎是使用 TPL 和 ThreadPool 的主要障碍。您确定您没有高估较低优先级的用处吗?
您将不得不投入大量工作来想出一些总是不如 TPL 强大(且测试/可靠性低得多)的东西。
我会重新考虑这一点。
This seems to be the main stumbling block for using the TPL and ThreadPool. Are you sure you're not over-estimating the usefulness of a lower priority?
You will have to put in a lot of work to come up with something that will always be much less powerful (and much less tested/reliable) than the TPL.
I would reconsider this.
通过阅读上述条件
一些问题
1-是否有任何其他线程将填充队列中的作业< T> ?
如果答案是肯定的,则可以在此处使用生产者/消费者设计模式,我不知道 .net 4.0,但此设计可以在 .net 3.5 中实现。
例如,请参阅此处。
By reading above conditions
Some questions
1- Is there any other thread which will populate jobs in Queue< T > ?
if the answer is yes than Producer / Consumer Deign Pattern can be used here i am not aware of .net 4.0 but this design can be implemented in .net 3.5.
See here for example.
就我个人而言,我通常会自己推出,因为我喜欢更严格的控制。
我在媒体浏览器中使用它:
它有一个相当优雅的 API,我有一天想添加的唯一功能是清理空线程池。
用法:
这有一些方便的重载,允许您对延迟的操作进行排队,另一个重载可以推送跳到队列前面的紧急作业。
Personally I roll my own usually, because I like having much tighter control.
I use this in Media Browser:
It has a fairly elegant API, only feature I would like to add one day is scavenging empty thread pools.
Usage:
This has a few handy oveloads that allow you to queue delayed actions, and another to push in urgent jobs that skip to the front of the queue.
这种情况BlockingCollection大声尖叫并且清晰。创建一个专用线程来监视队列并适当设置其优先级。当队列中没有项目时,
BlockingCollection.Take
方法将自动阻塞。This situation screams BlockingCollection loud and clear. Create a dedicated thread that watches the queue with its priority set approriately. The
BlockingCollection.Take
method will block automatically when there are no items in the queue.线程池听起来就是这样。实际上,你可以通过设置进程优先级来改变.NET自带线程池的优先级。将进程优先级降低一个档次,并将您的 UI 提高一个档次,您应该拥有正常优先级的 UI 和较低优先级的线程池。
A thread pool sounds like just the thing. Actually, you can change the priority of .NET's own thread pool by setting the process priority. Bump the process priority down a notch and your UI up a notch and you should have a UI at normal priority and thread pool at lower priority.