Ara*_*yan 5 c# multithreading backgroundworker windows-phone-7 windows-phone-7.1
我创建线程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() + "%";
}
Run Code Online (Sandbox Code Playgroud)
当应用程序停用时,线程未关闭,它被中止并发生异常.BackgroundWorker应用程序停用时与线程的接近程度如何?
小智 10
当一个应用程序被停用时,除了主UI线程之外的每个线程一旦变为活动状态就会抛出一个ThreadAbortException.这似乎是"按设计"作为一种迫使应用程序快速停止他们正在做的事情的方式.线程可以捕获ThreadAbortException并包装它们正在做的事情,但要注意ThreadAbortException将在catch块的末尾再次自动引发.finally块中的任何代码也将被执行.
对于您的特定问题,在应用程序停用时没有理由尝试取消BackgroundWorker,因为ThreadAbortException将发生并将有效地停止后台工作程序.如果你想在发生这种情况时做一些事情来清理,你可以在bw_DoWork中捕获ThreadAbortException,做你需要做的事情,然后让它死掉.
要在激活后重新启动它,您必须重新启动后台工作程序,就像第一次运行应用程序时一样.
你设置BackgroundWorker为可取消吗?
var bg= new BackgroundWorker();
bg.WorkerSupportsCancellation = true;
Run Code Online (Sandbox Code Playgroud)
从文档:
WorkerSupportsCancellation如果希望BackgroundWorker支持取消,请将该属性设置为true.如果此属性为true,则可以调用该CancelAsync方法来中断后台操作.
你的代码似乎也错了,你应该调用CancelAsync()线程代码的外部,这将设置CancellationPending你可以用来退出循环的标志.
虽然我不是100%肯定,因为我不知道bw变量来自哪里.`
| 归档时间: |
|
| 查看次数: |
9493 次 |
| 最近记录: |