gpt4 book ai didi

c# - 应用程序停用时如何关闭 BackgroundWorker 线程?

转载 作者:太空狗 更新时间:2023-10-29 22:08:29 26 4
gpt4 key购买 nike

我使用 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 block 的末尾自动再次引发。 finally block 中的任何代码也将被执行。

对于您的具体问题,没有理由在应用程序停用时尝试取消 BackgroundWorker,因为 ThreadAbortException 会发生并且会有效地停止后台工作程序。如果你想在这种情况发生时做一些清理,你可以在 bw_DoWork 中捕获 ThreadAbortException,做你需要做的,然后让它死掉。

要让它在激活后再次启动,您必须重新启动后台工作程序,就像您第一次运行该应用程序时所做的那样。

关于c# - 应用程序停用时如何关闭 BackgroundWorker 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7620098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com