我创建线程BackgroundWorker
,并且在循环中我每次都会检查是否CancellationPending
是真是假,就像这样:
public MainPage()
{
InitializeComponent();
bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
private void ButtonStart_Click(object sender, RoutedEventArgs e)
{
if (bw.IsBusy != true)
{
bw.RunWorkerAsync();
}
}
private void ButtonCancel_Click(object sender, RoutedEventArgs e)
{
if (bw.WorkerSupportsCancellation)
{
bw.CancelAsync();
}
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 1; i <= 100; i++)
{
Debug.WriteLine("The tread is working");
if (worker.CancellationPending)
{
e.Cancel = true;
bw.CancelAsync();
break;
}
else
{
System.Threading.Thread.Sleep(500);
worker.ReportProgress(i);
}
}
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
tbProgress.Text = "Canceled";
}
else if (e.Error != null)
{
tbProgress.Text = "Error: " + e.Error.Message;
}
else
{
tbProgress.Text = "Done";
}
}
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
tbProgress.Text = e.ProgressPercentage.ToString() + "%";
}
当应用程序停用时,线程没有关闭,而是中止并发生异常。线程的关闭程度如何BackgroundWorker
应用程序何时停用?
当应用程序停用时,除主 UI 线程之外的每个线程一旦变为活动状态都会抛出 ThreadAbortException。这似乎是“有意为之”的,旨在迫使应用程序快速停止正在执行的操作。线程可以捕获 ThreadAbortException 并结束它们正在执行的操作,但请注意,ThreadAbortException 将在 catch 块末尾再次自动引发。 finally 块中的任何代码也将被执行。
对于您的具体问题,没有理由在应用程序停用时尝试取消BackgroundWorker,因为将会发生ThreadAbortException并且将有效地停止后台工作程序。如果你想在发生这种情况时做一些清理工作,你可以在 bw_DoWork 中捕获 ThreadAbortException,做你需要做的事情,然后让它消亡。
要在激活后重新启动它,您必须重新启动后台工作程序,就像应用程序第一次运行时一样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)