在Winform中拖拽 一个BackgroundWorker控件,配合进度条控件能开启一个后台线程并报告进度条进度。编程
可是在执行后台线程的任务时,若是想要取消,怎样让其中止执行。this
注:spa
博客主页:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。.net
将BackgroundWorker控件的WorkerSupportsCancellation属性设置为true。线程
这里是直接经过控件设置属性的方式,若是是直接声明的对象,则能够经过对象.属性去设置。3d
若是不设置则会提示:此BackgroundWorker声明它不支持取消。。。code
在上面容许取消后,在取消按钮的点击事件中发起取消后台操做的请求。orm
this.backgroundWorker1.CancelAsync();
完整示例代码对象
private void btnCancel_Click(object sender, EventArgs e) { this.backgroundWorker1.CancelAsync(); this.DialogResult = DialogResult.Cancel; this.Close(); }
上面发起取消后台操做的请求后,并不会真正关闭后台进程,只是报告要取消后台进程。blog
若是要执行的操做是一个循环则会一直循环完。
在进行后台具体执行的操做时是这样绑定的
this.backgroundWorker1.DoWork += backgroundWorker1_DoWork; //触发事件 this.backgroundWorker1.RunWorkerAsync();
因此要在具体执行后台操做的方法 backgroundWorker1_DoWork中去进行判断并终止
在上面进行请求取消操做后,那么BackgroundWorker对象的CancellationPending属性就为true。
因此在具体执行后台操做的方法中的循环操做中
BackgroundWorker bgWorker = sender as BackgroundWorker; if ((bgWorker.CancellationPending == true)) { e.Cancel = true; errMsg = "已取消导出"; return false; } if (e.Cancel) { errMsg = "已取消导出"; return false; }