2010-12-09 147 views
2

我目前使用此代码涂调用web服务来获得数据的应用程序页面关闭造成的问题。 一切都很好,直到我试图连续调用这个方法10次而不等待第一个调用完成。使用的Rx调用WCF服务方法异步是

这样做使我有倒闭的问题,并为我的所有结果相同的结果对象。

有没有人在Rx.Net之前遇到过这个问题?如果有的话,是否有人有想法或领导,以便我可以解决这个问题。

public void GetPage(long pageId, Action<PageDTO> observer) 
    { 

     Observable.FromEvent<GetPageCompletedEventArgs>(
      handler => Service.GetPageCompleted += handler, 
      handler => Service.GetPageCompleted -= handler) 
      .Select(eventHandler => eventHandler.EventArgs.Result) 
      .Take(1) // necessary to ensure the observable unsubscribes 
      .ObserveOnDispatcher() // controls which thread the observer runs on; 
      .Subscribe(observer, HandleError); 

     Service.GetPageAsync(pageId); 
    } 
+0

您是否可以使用外部依赖性较低的示例复制问题? – 2010-12-10 00:27:23

回答

3

Service总是同一个实例吗?如果是的话,你会遇到各种各样的疯狂,由此GetPageCompleted活动将通过一个不同的呼叫(使用不同的参数)创建的FromEvent来处理,这可以解释为什么你的结果是被称为在所有的方法相同同一时间。

您可以通过使用开始/结束的方法解决这个具体问题,但你仍然可能运行与基础连接的争用问题。

public void GetPage(long pageId, Action<PageDTO> observer) 
{ 
    Observable.FromAsyncPattern<long, PageDTO>(
      service.BeginGetAwards, service.EndGetAwards)(pageId) 
     .ObserveOnDispatcher() // controls which thread the observer runs on; 
     .Subscribe(observer, HandleError); 
} 
+0

所以我应该为每个调用创建一个新的实例。我会试一试。至于开始和结束的方法,它们在Silverlight中不可用 – 2010-12-10 17:45:20