2011-09-13 6 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

PredictionクラスにGet_DataCompletedという名前のイベントを追加する必要があります。

すべてのservice_ * Comlpetedメソッドが呼び出されたときにこのイベントを発生させます。これを行うには、メソッドの最後にintをデクリメントし、int = 0のときにGet_DataCompletedを呼び出す呼び出しを追加することができます。 Get_Dataの先頭でintに5を設定します。

あなたはGet_Dataが呼び出され、intは> 0である(あるいは以前の呼び出し、再初期化、...中止)Get_DataCompletedが発生したとき

コールp.PredictをInvalidOperationExceptionがをスローすることがあります。

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 ..あなたの速いレスポンスのための高校ですが、あなたは私があなたが言及するトリックを行うことができますどのようにコードを私に提供できますか?おかげで –

+0

完了、コードは汚いですが、あなたはトリックを参照してください。 – Guillaume

+0

ああ私はあなたの助けを借りて非常にギョームを参照してください:) –

1

非同期プロセスが完了したことを処理するコールバックを登録します。

しかし、「火災と忘れ」の非同期の全体的なポイントではありませんか?通話者に連絡することに多すぎる場合は、同期呼び出しに切り替えてデザインを再考する必要があります。

+0

あなたは常に同期呼び出しにswtichすることはできません。私はsl4についてはわかりませんが、Windows Phone 7(sl2に基づく)では、非同期のみが利用可能です。 – Guillaume

関連する問題