2011-10-22 53 views
1

我有一個類根據在對象狀態發生變化之前引發事件的約定公開可取消事件,狀態改變後的事件。發佈者(服務器)公開的更改前事件的格式爲StateChanging,其參數爲CancelEventArgs,而更改後事件的格式爲StateChanged。這爲事件的訂閱者(客戶端)提供了在啓動之前取消操作的能力。如何取消需要在服務器端啓動的長時間運行(而不是由客戶端啓動)

現在我改變了其中的一個操作,使其成爲一個長時間運行的操作,並且我想給訂戶在操作開始後也可以取消操作(並且瞭解操作進度)。我想到了event-based asynchronous pattern

問題是,我想保留before-change和after-change事件模式,因爲它是發佈者,在某些時候需要操作,而在異步模式中,在我看來,它是客戶端具體要求某個操作是異步運行的。另一種可能性(但對我來說看起來並不高雅)可能是讓服務器暴露一個事件(例如OperationRequired),以允許客戶端知道需要在服務器端完成哪些事情並相應調用RunOperationAsync()方法。請評論並添加您的建議。

回答

0

基於事件的異步模式通常首選用於由UI控制的操作。另一種方法是異步編程模式,通常首選服務器或庫API。如果您選擇實施EAP,那很好。

看看BackgroundWorker的實現 - 這是EAP支持取消等最好的例子。它通過標準的CancelAsync()方法提供取消。

+0

我知道關於BackgroundWorker的一些事情,但我沒有看到正確的方式來使用它,在我的情況下,我有服務器在某個時間點啓動未特別要求的操作。我試圖更好地解釋:客戶端請求某個操作X並且服務器正常執行操作X;但有時服務器(根據其狀態)需要在X之前執行操作Y,並且由於Y可以長時間運行,服務器應通知客戶端它正在啓動Y並允許客戶端最終取消它(反過來也會取消X)。 –

+0

如果你的客戶事先知道它是否準備等待Y,它可以在你的服務器對象上設置一個屬性,比如'bool CancelIfYRequired',然後調用你的'xxxAsync'方法。或者它可以作爲一個額外的參數傳遞它。同樣,您可以將一個屬性添加到您的'xxxCompletedEventArgs'類中,以指示何時由於此情況而取消操作。您的'CancelAsync'方法應該在執行Y或X時支持取消。 –

相關問題