私はBackgroundWorker
でスレッドを作成し、CancellationPending
はこのように、真であるかどうループに私はすべての時間を確認してください。アプリケーションが無効になっているとき、BackgroundWorkerスレッドはどのくらい閉じていますか?
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
にあるか?
試しましたか?それはあなたが必要とすることをしていますか? –
@ liho1eyはい、私はそれを試してみました。私はこれらのコードをアプリケーションレベルではなくxaml.csページに書きます。 –
okですが、あなたは 'CancelAsync()'を呼び出していますか? –