
边学习边分享,纯属抛砖引玉。
线程的一个好处是异步的执行操作,在winform中,很多耗时操作执行时,为优化用户体验,避免长时间等待,从而运用线程技术异步的执行耗时操作,但不会阻塞主线程。
最近系统很多耗时查询导致体验很差,于是想到了用BackGroundWorker异步处理。而且要支持某些耗时达到几十秒的操作,可以取消。
BackGroundWorker有CancelAsync()这个方法。该方法只会将BackGroundWorker的CancellationPending属性设为true,但不会实际终止线程!网上找了些资料,代码如下

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){for (int i = 0; i < 100; i++){ if (backgroundWorker1.CancellationPending){e.Cancel = true;return;}}}
即在doWork事件中,不停的循环判断是否执行了取消操作。这种适用于执行多次方法时,而且无法在某个方法执行时将线程取消。backgroundworker如果我doWork事件里,没有for循环,而是一次耗时的数据访问操作,那这样的处理没有任何意义。
于是在下想到,可以在doWork事件里做如下处理
1.异步的去执行耗时操作。

2.while监视异步耗时操作是否完成,只要未完成就一直循环。循环内部判断是否执行了取消操作。如果执行了取消操作,则终止线程。代码如下
private delegate int LongTimeDele(); private bool isComplated=false; private int result=0;private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {this.BeginInvoke(new LongTimeDele(()=>{ Thread.Sleep(10000);////模拟耗时 for (int i = 0; i < 100; i++) { result++; } isComplated=true;}));while(!isComplated){ if (backgroundWorker1.CancellationPending){ e.Cancel = true; return; } }}
试验之后,不知何故在this.BeginInvoke中的循环会阻塞主线程! 即界面卡主不动了,BeginInvoke应该是一步执行的,在下功力尚浅,不知何故,还请高手指教。
于是想到了异步委托。backgroundworker直接上代码
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-27011-1.html
我觉得这样是很有道理的
早上看到系统有更新提示
500颗原齐射
文章中