2013-02-12 41 views
1

我正嘗試在Windows Phone 8應用程序中使用基於任務的異步模式。想法是,所有長時間運行的操作都提及取消令牌,並且在應用程序中有一個地方存儲所有這些令牌。當應用收到Deactivated事件時,它將遍歷所有令牌並取消它們。取消應用程序停用期間的任務時的競爭條件

問題是,當應用停用時,長時間運行的線程沒有計劃運行,這意味着如果我想在該線程中使用CancellationToken.ThrowIfCancellationRequested();,則只在應用恢復時調用,而不是在應用停用時調用。當然,這不是我想要的。如果我正在做一個簡單的技巧,如token.Register(() => Thread.Sleep(1000));,即暫停要求取消一會兒的線程,那麼第二個線程有機會運行,並且所有內容都會像魅力一樣被取消。但是,這是一個骯髒的黑客攻擊,我不想在我的應用程序中使用它。

問題是如何確保在操作取消完成時應用程序不會退出?我認爲合作取消的標誌是拋出OperationCancelledException,但如何等待它,特別是如果我只有一個引用CancellationTokenSource,但不是Task對象?有沒有其他方法可以知道這些?

非常感謝提前!

P.S.如果你需要更多的代碼來幫助我,請問。

+0

爲什麼這不是你想要的?爲什麼它只是在應用程序恢復後實際取消操作而已? – svick 2013-02-12 11:21:26

+0

我的工作線程沒有收到關於取消的通知,這就是問題所在。它應該停止寫入文件並在取消請求時正確關閉它,然後拋出OperationCancelledException作爲成功取消的確認。如果它在應用停用之前不會發生,則文件可能會處於某種意外狀態,因爲應用可能會在停用後被殺死。 – Haspemulator 2013-02-12 11:49:30

回答

0

我認爲存儲所有CancellationToken s在你的情況下不夠,你還需要存儲相應的Task s。在您的Deactivated處理程序中,您將取消所有的令牌,然後取消所有存儲的Task(接收OperationCancelledException s)。 (我不確定Deactivatedasync是如何工作的,你可能需要一些東西讓系統知道你還沒有真正完成停用。)

+0

謝謝,我已經嘗試過了,我認爲它應該可以工作。但是,我有一個執行問題。你認爲在這個問題上添加細節或創建一個單獨的問題是有意義的嗎? – Haspemulator 2013-02-12 14:23:02

+0

好吧,設法讓它工作,謝謝! – Haspemulator 2013-02-13 11:54:48