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

相关问题