在我的應用程序中,我有一個主窗口並進入它,在一個框架中加載一個頁面。當用戶按下按鈕時,該頁面執行很長時間的任務。我的問題是,當長時間的任務正在做,用戶按下主窗口的關閉按鈕,應用程序似乎沒有完成,因爲我在VS2008中調試它,我可以看到突出顯示停止按鈕。如果我想完成,我必須按停止按鈕,應用程序不會在應用程序退出時自動停止調試。我認爲.NET會在應用程序退出時自動停止backgroundworkers,但在看到此行爲後我不確定。我曾試圖強制並取消後臺工作人員在卸載活動頁面中,如下所示:wpf在應用程序退出時取消backgroundworker
private void Page_Unloaded(object sender, RoutedEventArgs e)
{
// Is the Background Worker do some work?
if (My_BgWorker != null && My_BgWorker.IsBusy)
{
//If it supports cancellation, Cancel It
if (My_BgWorker.WorkerSupportsCancellation)
{
// Tell the Background Worker to stop working.
My_BgWorker.CancelAsync();
}
}
}
但沒有成功。幾分鐘後,我做了CancelAsync()後,我可以看到backgroundworker完成並引發RunWorkerCompleted,並且我可以看到任務已完成,檢查事件中的e.Cancelled參數,但在此事件執行後,應用程序繼續而不退出,不知道在做什麼....
我將WorkerSupportsCancellation設置爲true以支持在開始時取消。
我會apreciate所有答案。謝謝。
好的,當我做My_BgWorker.CancelAsync();從執行backgroundworker的頁面開始,它將CancellationPending設置爲true,現在我在DoWork中檢查此屬性值。然後,當它是真實的我完成的DoWork方法,但我不明白一兩件事:退出後的DoWork時RunWorkerCompleted事件引發的爭論ê作爲RunWorkerCompletedEventArgs應該是因爲我做了e.Cancelled =真不虛: My_BgWorker.CancelAsync ()或者我很困惑?爲什麼我收到e.cancelled爲false,如果我已經請求使用CancelAsync()取消後臺操作,則不會返回true? – toni
e.Cancel應該在DoWork的事件設置,如果取消請求已經被考慮到 –
是,在DoWork的事件,我把一個破發點,在它和CancellationPending設置爲true結束,但RunWorkerCompleted當事件後引發DoWork完成後,RunWorkerCompleted中的e.Cancelled屬性爲false。這是正常的嗎?不應該是真的(因爲我要求取消背景工作操作)? – toni