2012-05-20 50 views
4

我在Silverlight項目中使用RIA服務。我在客戶端使用LoadOperation類從服務器加載一些數據。如何取消RIA服務LoadOperation

在加載的過程數據的請求可能是由不同的數據更新請求所取代。這是基於對服務器進行的多個LoadOperations,然後用戶單擊取消按鈕。

如果我把我的LoadOperation並調用它的'取消'方法,該操作似乎取消,但服務器端代碼不會停止,並使用fiddler我可以看到操作完成,HTTP狀態代碼爲200返回。

,當你調用「取消」是什麼在服務器上做的,我希望它來調用一個ThreadAbortException或類似的東西?這可以改善嗎?

+0

這是iis6還是iis7? –

+0

IIS 7.5,與Windows 2008 R2的一個 – peter

回答

1

所以我不得不看看反編譯RIA服務來源,這似乎是取消是僅限客戶端。沒有改變服務器端進程。

基本上當您運行operation.Cancel()時,它確保操作可以被取消(operation.CanCancel),然後將其標記爲取消,並觸發完成操作。

這意味着服務器端的操作仍然繼續,但是它完成

時一旦操作完成後,你需要檢查operation.IsCanceled屬性,看看是否沒有與響應客戶端完成操作被取消。如果是這樣,就忽略結果。

+0

是的,這是我在想什麼,但它並沒有真正回答這個問題。這個取消的事情只對我有用,如果它也停止服務器上的請求,因爲它包含SQL語句,這將加載SQL服務器。如果沒有辦法做到這一點,那麼我不會使用取消。 – peter

+0

是的,不幸的是沒有辦法取消服務器端操作。 –

0

從我所瞭解的取消使用加載操作的服務器執行不可用。

你可以強硬運行自己的取消impelmentation: (取決於如果您使用的DomainService基地或LinqToEntitiesDomainService基地impelmentation會變動內容)

服務隊側

在服務方法開工負荷在一個新線程中 把這個線程對象放在會話中 你的線程對象應該以某種方式取消DbConnection ... perpare一個服務方法(Invoke)取消當前正在執行的 線程對象登記在會話,從會話中LoadOperation對象上

客戶端

呼叫取消中刪除它,並調用取消請求。

一個需要注意的是,你註釋掉OnSessionStart並停止在Global.asax中爲了 每用戶多線程的方式來執行RIA服務其他每個請求將等到前一個請求完成(這必須做與RIA服務線程,而不是我們的線程對象)

希望這有助於 問候

PS:我們也使用悲觀鎖與RIA Services和的EntityFramework,類似的解決方案...