2010-07-29 62 views
0

我正在處理完全充滿異步調用Web服務的Silverlight 3.0項目。在主頁面,它會獲取一些所需的數據,以便應用程序使用3個異步調用正常工作。目前,應用程序不會在執行這些調用時禁用任何控件,這意味着用戶可以在沒有所需數據的情況下與它進行交互。我需要禁用整個網格,並且只有在所有3個Async調用完成後才啓用網格。WCF異步調用輪詢或標記 - 最佳實踐

這樣做的最佳做法是什麼。

這是我的電話:

client.GetAllAsync(); 
client.GetAllCompleted += new EventHandler<GetAllCompletedEventArgs>(client_GetAllCompleted); 

client.GetActualAsync(); 
client.GetActualCompleted += new EventHandler<GetActualCompletedEventArgs>(client_GetActualCompleted); 

client.GetSomeAsync(); 
client.GetSomeCompleted += new EventHandler<GetSomeCompletedEventArgs>(client_GetSomeCompleted); 

回答

2

似乎很多工作只是排隊某些用戶的交互性。

我通常提供一個應用範圍的界面:如果你有重則多線程,你會

public partial class MainShell : UserControl, IAppGlobalState 
{ 
    private int _queue; 
    private object _mutex = new Object(); 

    public void BeginASync() 
    { 
     Monitor.Enter(_mutex); 
     if (_queue++ == 0) 
     { 
     VisualStateManager.GoToState(this, "BusyState", true); 
     } 
     Monitor.Exit(_mutex); 
    } 

    public void EndAsync() 
    { 
     Monitor.Enter(_mutex); 
     if (--_queue == 0) 
     { 
     VisualStateManager.GoToState(this, "IdleState", true); 
     } 
     Monitor.Exit(_mutex); 
    } 
} 

當然:

public interface IAppGlobalState 
{ 
    void BeginAsync(); 
    void EndAsync(); 
} 

在實現中,我會做到這一點對這些使用Interlocked,但大多數時候你會從同一個線程調用它。然後,你只需要做:

GlobalState.BeginAsync(); 
client.FirstAsyncCall(); 

GlobalState.BeginAsync(); 
client.FirstAsyncCall(); 

,然後返回,剛:

GlobalState.EndAsync(); 

如果你嵌套調用,沒有問題,這種方法解開它們。

+0

什麼是'GlobalState'? – Tony 2011-06-07 18:11:27

0
  1. 讓工作項的單位在您的Silverlight
  2. 這UOW引發事件結束
  3. 綁定該事件到你的GUI代碼時
  4. 在工作單元中使用信號或簡單的計數器來提高「完成」事件。