作者suny999 (不慌不忙)
看板C_Sharp
标题Re: [问题] 该如何等一个子函数做完事情呢?
时间Sun Jun 13 19:47:53 2010
※ 引述《scottzz (无心工作,等待机会)》之铭言:
: ※ 引述《liaommx (Orz)》之铭言:
: : 请问一下,这个写法虽然compiler会过,
: : 可是实际点button的时候会整个卡住,
: : 不知道会是甚麽原因呢?
: 说明一下,AutoResetEvent 类别的Waitone方法会Hold整个Thread.
: 因此,我是预设您的Timer物件是用 System.Timers.Timer 去宣告出来的
: 而非使用控制项的Timer. 因为System.Timers.Timer 类别是会每次时间
: 一到就产生一个Thread去执行Timer内部动作.因此就算主Thread被
: waitone方法所锁住不动,但Timer还是会定时去动作的.因此只要count数
: 一到再Set时, 就能解开主Thread的锁定继续往下Go.
可以顺势再问一个问题吗?
是这样的,之前做Sap2000的Plugins,检核桥梁的钢箱梁Element的断面力量,
刚好每个Element至少需汇出两个断面力,想说可以用BackgroundWoker来多工处理,
实验结果双核CPU的使用率将近99%,但只提昇约20~90%效率(4核CPU才能超过70%),
我猜应该是用BK(BackgroundWoker)时分出两个Threads: BKa、BKb
再利用Sleep来等这两个Worker结束以换下一个Element:
while(BKa.isBusy || BKb.isBusy) Threads.Sleep(0);
看到scottzz的建议很兴奋,
如果用BackgroundWorker开的子方法也可以用AutoResetEvent
来hold主Thread吗?
效率应该会比Sleep优吧!等我有空再去试试看,如果可行先谢了!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 115.43.126.69
1F:→ suny999:刚试了真的有效,效率增加约2成,谢谢版上的高手们!! 06/13 21:28