2009-12-17 146 views
3

我正在開發一個Silverlight應用程序,它可以向多個Web服務發出多個異步請求。我希望模式「加載」對話框保持活動狀態,直到所有請求都完成。我通過使用一個計數器變量來管理這種情況,該變量在每個異步請求開始事件上遞增,並在每個異步完成事件上遞減(對我來說似乎不是線程安全的)。當計數器爲零時,綁定到UI的屬性會關閉對話框。有沒有比我的解決方案更好/更一般的處理這個問題的方法?多個異步請求同步

回答

0

您的櫃檯解決方案是一個有效的解決方案。無論你做什麼,你都必須跟蹤你的所有請求,並瞭解他們何時到達(當計數達到零)。

你可以做不同的事情來清理你的代碼,比如把所有這個實現放在一些MultiAsyncWaiter類中,這個類在完成時返回一個事件。但基本的暗示將保持不變:追蹤它們直到它們全部返回。

你說得對int的線程不安全。如果您使用互鎖操作(請參閱註釋)或鎖定該變量,則可以保證實現線程安全。

爲什麼volatile關鍵字不能工作:在多個線程更改變量的情況下,遞減需要一個互鎖操作,這在技術上是一個讀寫操作。這是因爲另一個線程可以更改讀取和寫入之間的值。

+1

使int變得不穩定 - 您需要使用Interlocked.Increment和.Decrement來確保您不會丟失更新(http://msdn.microsoft.com/zh-cn/library/dd78zt0c .aspx) – 2009-12-17 21:02:12

+0

謝謝,更新了答案。 – santosc 2009-12-18 00:26:42

+0

感謝您的回答;我發現了有關Silverlight的Rx框架,並在IObservable接口上使用了ForkJoin()方法(這是相當了不起的東西,請查看http://www.minddriven.de/?p=563&cpage= 1條#評論-4425) – gn22 2009-12-18 21:48:30