b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

backgroundworker_backgroundworker正忙_C# stringbuilder

电脑杂谈  发布时间:2017-01-17 23:59:58  来源:网络整理

backgroundworker_backgroundworker正忙_C# stringbuilder

边学习边分享,纯属抛砖引玉。

线程的一个好处是异步的执行操作,在winform中,很多耗时操作执行时,为优化用户体验,避免长时间等待,从而运用线程技术异步的执行耗时操作,但不会阻塞主线程。

最近系统很多耗时查询导致体验很差,于是想到了用BackGroundWorker异步处理。而且要支持某些耗时达到几十秒的操作,可以取消。

BackGroundWorker有CancelAsync()这个方法。该方法只会将BackGroundWorker的CancellationPending属性设为true,但不会实际终止线程!网上找了些资料,代码如下

backgroundworker正忙_backgroundworker_C# stringbuilder

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.异步的去执行耗时操作。

backgroundworker_C# stringbuilder_backgroundworker正忙

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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...