2012-01-18 58 views
1

我有一個問題的一點點帶有取消我的背景工人在Application_Deactivated事件在Windows Phone 7上application_deactivated事件取消BackgroundWorker的WP7

我的後臺工作與網絡服務同步,但我可以我猜猜它要走多久了,我只想取消工人。與此問題是,事件處理程序完成後,應用程序將只會殺死所有線程,所以我不能正確取消它。

我想什麼做的是這樣的:

Application_Deactivated 
{ 
    Backgroundworker.RunWorkerCompleted += bw_completed; 
    Backgroundworker.Cancel async 

    // wait till completed event which confirm the background thread has been cancelled 
} 

我第一次嘗試使用在事件處理程序的AutoResetEvent,但是這不會工作造成App.xaml.cs線程是主應用程序的線程和在此線程中等待的線程將阻塞整個應用程序。

的cancelAsync之後被稱爲事件處理程序,該應用程序就會轉到休眠和恢復,被稱作實際的後臺工作會給出錯誤大約一個空引用到Web響應網絡處理程序時。

我已經在後臺工作中檢查取消掛起,並且取消功能已經通過取消按鈕進行了測試,所以這不是問題。它純粹是我需要等到後臺工作人員退出正常。

我發現本網站上像這樣的一些成果: How close BackgroundWorker thread when application is deactivated?

但是,只給了一個解決方案與ThreadAbortException,但我寧可不使用這一個。

如果您需要更多的代碼,我可以提供。

+0

你想創建一個超時功能嗎? – 2012-01-18 14:10:25

+0

不,我試圖等待應用程序進入休眠狀態,直到我的後臺線程被取消了隱藏或錯誤。我有10秒鐘等待,但我無法找到一種方法來聲明這一次,而不讓整個應用程序掛起。 – arjanhgroen 2012-01-18 14:16:16

+0

[應用程序停用時如何關閉BackgroundWorker線程?](http://stackoverflow.com/questions/7620098/how-close-backgroundworker-thread-when-application-is-deactivated)。這個問題的答案提到你可以在你的工作線程中響應'CancellationPending' - 只有在你不這樣做的時候''ThreadAbortException''纔會被拋出。 – 2012-01-19 07:39:14

回答

0

您的線程正在關閉,因爲它們是後臺線程。當一個應用程序關閉所有後臺線程時關機,並且你無能爲力。

您可以創建一個前臺線程。該應用程序不會/不能殺死前臺線程,並會運行,直到前臺線程終止。

使用這種方法執行你的電話你需要做這樣的事情:

Application_Deactivated 
{ 
    thread t=new Thread(CancelCall); 
    thread.IsBackground=false;//make this a foreground thread 
    thread.Start(); 
} 

private void CancelCall(object state) 
{ 
    Backgroundworker.RunWorkerCompleted += bw_completed; 
    Backgroundworker.Cancel async 
    Thread.Sleep(10000); wait for 10 seconds 
} 

值得一提的是BackgroundWorker的創建後臺線程將是由應用程序被關閉反正這樣我不確定通過這樣做你會得到多少額外的東西。 10秒關機不會讓用戶開心,他們很可能會抱怨該應用程序是a)緩慢或b)有錯誤。

除非有什麼積極的「爆炸」,並且您的用戶反饋或錯誤報告不好,否則我建議您保持原樣。