首页 新闻 搜索 专区 学院

线程池中一个线程给一个信号量阻塞另一个线程运行

0
悬赏园豆:20 [已解决问题] 解决于 2008-08-14 09:11
<P>线程池中有两个线程,A,B,其中B是一个轮询线程,使用了&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ThreadPool.RegisterWaitForSingleObject(waitObj, new WaitOrTimerCallback(test), null, 5000, false);<BR></P> <P>我希望通过线程A来,来控制(阻塞或是继续)其轮询过程</P>
lexus的主页 lexus | 初学一级 | 园豆:0
提问于:2008-08-04 11:11
< >
分享
最佳答案
0
用WaitOne方法,就可以阻塞啦.. 不知道,你想怎么用,如果你希望的是,当通知有数据需要处理的时候,可以用Queue,然后用While去判断这个Queue的长度是否大于0,如果是,就Set, 反之WaitOne .....
咸蛋超人 | 菜鸟二级 |园豆:485 | 2008-08-10 16:16
其他回答(2)
0
传递一个WaitHandle参数试试
玉开 | 园豆:8822 (大侠五级) | 2008-08-04 13:29
0
你只需要在你的线程函数里面有一个循环,每次先等待某个信号量就可以了了。 2008-08-09 更新: 昨天奥运开幕了~~~~ 我并不确定.NET是否提供了默认的支持。详细的方案,还是要多看看MSDN。找找上面有没有特定的解决方案。 如果我来做,我会这样做: 1. 将线程中需要执行的动作划分为多个单元。 一般情况下,长时间执行的线程中都会有循环或多个嵌套的循环。循环体的开始部分应该就是我所说的单元的边界。 2. 定义一个信号量 在启动一个线程的时候,为这个线程定义一个信号量。 3. 在单元的分界点检查信号量 在每个单元的开始处,检查信号量,如果信号量被设置,设置一个循环不断的检查该信号,直到信号量被复位,再继续开始这个单元的执行。 因此,如果你希望能够产生立刻中断的感觉,只需要将执行单元划分的足够细小。就可以了。其中需要注意的是:在循环检查信号量的循环体中,最好让线程Sleep一下。否则,会CPU占用率很高。 思路大概如此,具体的代码实现,因为很久没有写过这方面的代码了,就不花时间去写和调试了。多看看MSDN,应该很容易实现上面的思路的。有什么问题我们可以再讨论(给我发短消息:))。
Colin Han | 园豆:3041 (老鸟四级) | 2008-08-04 13:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册