MSDN上Managed Threading Best Practices
的摘录:
不要从主程序控制工作线程的执行(例如,使用事件)。相反,设计您的程序,以便工作线程负责等待工作可用,执行它,并在完成后通知程序的其他部分。如果您的工作线程没有阻塞,请考虑使用线程池线程。 Monitor .. ::。PulseAll在工作线程阻塞的情况下很有用。
我想知道这描述了什么,所以我可以搜索基本的实现来开始使用。
答案 0 :(得分:2)
摘录的含义是:
假设您有一个生产者 - 消费者问题,您有一个消费者线程。如果你有一个专用线程(非ThreadPool),那么你应该使用WaitHandle :: WaitOne调用使该线程等待,直到你有东西要处理(可能在进程队列中)。当生成器填满队列时,它可以调用WaitHandle :: Set()来通知线程开始处理队列。 WaitOne()用于专用线程,因为每次要处理队列时创建新的专用线程都会很昂贵。
DoProcessQueue()
{
while(RUNTHREAD)
{
... process queue items
waitHandle.WaitOne(); // will wiat here until producer thread calls Set()
}
}
建议ThreadPool线程用于小任务,因此如果您打算使用WaitOne(),则不应使用ThreadPool线程,因为ThreadPool是每个应用程序都可用的全局资源,阻塞池线程不是一个好选择。
答案 1 :(得分:0)
答案 2 :(得分:0)
这听起来像是一种分散的“代理”方法。
编写多线程代码的“传统”方式有点像工作中的微观管理 - 老板将所有工作分发出去,其他所有人都期望等待它给予他们。任何需要在团队成员之间传递的工作都是通过老板传递的。
基于代理的方法就像授权团队中的每个人一起寻找并完成工作,根据需要在团队成员之间传递工作。老板知道发生了什么,但只有执行监督角色。