2011-09-13 53 views
2

我有一個WCF服務,並在我的Silverlight 4應用程序中使用它。我有5個異步調用。我怎麼知道他們已經完成了?我如何知道我的異步方法已在WCF服務中完成?

void service_StochSlowCompleted(object sender, StochSlowCompletedEventArgs e) 
    { 
     int count = e.Result.Count/2; 
     for (int i = 0; i < count; i++) 
     { 
      Stoch.Add(e.Result[i]); 
     } 
    } 

    void service_MovingAvgCompleted(object sender, MovingAvgCompletedEventArgs e) 
    { 
     MA = e.Result; 
    } 

    void service_MomentumCompleted(object sender, MomentumCompletedEventArgs e) 
    { 
     PMO = e.Result; 
    } 

    void service_RSICompleted(object sender, RSICompletedEventArgs e) 
    { 
     RSI = e.Result; 
    } 

    void service_OBVCompleted(object sender, OBVCompletedEventArgs e) 
    { 
     OBV = e.Result; 
    } 


public void Get_Data(ObservableCollection<double> high, ObservableCollection<double> low, ObservableCollection<double> open, ObservableCollection<double> close, ObservableCollection<double> volume, ObservableCollection<DateTime> date) 
    { 
     service.OBVAsync(0, close.Count - 1, close, volume); 
     service.RSIAsync(0, close.Count - 1, close, 9); 
     service.StochSlowAsync(0, close.Count - 1, high, low, close, 14, 3, 14); 
     service.MomentumAsync(0, close.Count - 1, close, 10); 
     service.MovingAvgAsync(0, close.Count - 1, close, 10); 

     Close = close; 
     Date = date; 

    } 
public void Predict() 
    { 
     //some code uses the results returned from the serivce 
    } 

外,我有:

Prediction p = new Prediction(); 
p.Get_Data(high, low, open, close, volume, date); 
p.Predict(); 

所以..請我怎樣才能知道?????

回答

1

您應該將名爲Get_DataCompleted的事件添加到Prediction類。

當調用了所有的service_ * Comlpeted方法時引發此事件。爲此,您可以在方法末尾添加一個調用,以減少int,並在int = 0時調用Get_DataCompleted。 在Get_Data開始時將int設置爲5。

時GET_DATA被調用,int是> 0您可能引發InvalidOperationException(或中止以前的調用,重新初始化,...)當Get_DataCompleted提高

呼叫p.Predict。

public event EventHandler Get_DataCompleted; 

private int pendingCalls; 

private void OnCompleted() 
{ 
    pendingCalls -= 1; 
    if (pendingCalls == 0 && Get_DataCompleted != null) 
    Get_DataCompleted(this, EventArgs.Empty); 
} 

void service_StochSlowCompleted(object sender, StochSlowCompletedEventArgs e) 
{ 
    int count = e.Result.Count/2; 
    for (int i = 0; i < count; i++) 
    { 
    Stoch.Add(e.Result[i]); 
    } 
    OnCompleted(); 
} 

void service_MovingAvgCompleted(object sender, MovingAvgCompletedEventArgs e) 
{ 
    MA = e.Result; 
    OnCompleted(); 
} 

void service_MomentumCompleted(object sender, MomentumCompletedEventArgs e) 
{ 
    PMO = e.Result; 
    OnCompleted(); 
} 

void service_RSICompleted(object sender, RSICompletedEventArgs e) 
{ 
    RSI = e.Result; 
    OnCompleted(); 
} 

void service_OBVCompleted(object sender, OBVCompletedEventArgs e) 
{ 
    OBV = e.Result; 
    OnCompleted(); 
} 


public void Get_Data(ObservableCollection<double> high, ObservableCollection<double> low, ObservableCollection<double> open, ObservableCollection<double> close, ObservableCollection<double> volume, ObservableCollection<DateTime> date) 
{ 
    if (pendingCalls > 0) 
    throw new InvalidOperationException(); 
    pendingCalls = 5; 
    service.OBVAsync(0, close.Count - 1, close, volume); 
    service.RSIAsync(0, close.Count - 1, close, 9); 
    service.StochSlowAsync(0, close.Count - 1, high, low, close, 14, 3, 14); 
    service.MomentumAsync(0, close.Count - 1, close, 10); 
    service.MovingAvgAsync(0, close.Count - 1, close, 10); 

    Close = close; 
    Date = date; 

} 
public void Predict() 
{ 
    //some code uses the results returned from the serivce 
} 

外:

Prediction p = new Prediction(); 
    p.Get_Data(high, low, open, close, volume, date); 
    p.Get_DataCompleted += new EventHandler(p_Get_DataCompleted); 

void p_Get_DataCompleted(object sender, EventArgs e) 
{ 
    (sender as Prediction).Predict(); 
} 
+0

您好Guillaume .. thanx爲您的快速反應,但你可以請你提供我的代碼我怎麼可以做你提到的詭計?謝謝 –

+0

完成後,代碼很髒,但你看到了訣竅。 – Guillaume

+0

啊哈我看到了,非常感謝你的紀堯姆對你的幫助:) –

1

註冊回調,處理異步進程已完成的事實。

但是,不是「點燃和遺忘」的不同點嗎?如果你太依賴於回覆給調用者,也許你應該切換到同步調用並重新考慮你的設計。

+0

你不能總是對等維護同步調用。我不知道SL4,但在Windows Phone 7(基於SL2),只有異步可用。 – Guillaume

相關問題