2013-04-25 97 views
0

我想創建一個可觀察的wcf調用包裝,並創建爲波紋管。可觀察的訂閱未達到完成

的方法是這樣的,

private IObservable<List<string>> Search(string searchTerm) 
    { 
     return Observable.Create<List<string>>(o => 
     { 
      var searchClient = new SearchServiceClient(); 
      var s = Observable 
       .FromEventPattern<SearchCompletedEventArgs>(searchClient, "SearchCompleted"); 
      var subscription = s.Subscribe(
       r => 
       { 
        if (r.EventArgs.Error == null) 
         o.OnNext(r.EventArgs.Result); 
        else 
        { 
         o.OnError(r.EventArgs.Error); 
        } 
       }, 
        e => 
        { 
         o.OnError(e); 
        }, 
         () => 
         { 
          o.OnCompleted(); 
         }); 
      searchClient.SearchAsync(searchTerm); 
      return subscription; 
     }); 
    } 

和方法調用,

Search("reactive").Subscribe(
        r => 
        { 
         MessageBox.Show("Result"); 
        }, 
        e => 
        { 
         MessageBox.Show(e.ToString()); 
        }, 
        () => 
        { 
         MessageBox.Show("Completed"); 
        }); 

但它永遠不會伸手完成塊。你能建議我要去哪裏嗎?

@Edited 26日

感謝斯托Vučetin,Rarous和李·坎貝爾。我已經測試了所有三個建議,都在工作。但我喜歡Petar的方法使單行代碼成爲可能。即使它看起來Observable.FromAsyncPatterns被depricated。

回答

1

如果您可以爲您的WCF客戶端生成異步方法,則可以嘗試此方法。

static void Main(string[] args) 
     { 
      var searcher = Search("test").Subscribe(Console.WriteLine); 
      Console.WriteLine("Done"); 
      Console.ReadLine(); 
     } 


     private static IObservable<string[]> Search(string searchTerm) 
     { 
      var searchClient = new Service1Client(); 

      return Task<string[]>.Factory.FromAsync(searchClient.BeginGetData, searchClient.EndGetData, searchTerm, null).ToObservable(); 
     } 
1

從事件創建的觀察對象從未運行完成。正如Petar提到的,您可以從Async模式創建Observables。相反鑄造Task可觀察到的,你可以使用工廠方法:

IObservable<string[]> Search(string searchTerm) 
{ 
    var searchClient = new Service1Client(); 
    return Observable.FromAsyncPatterns(searchClient.BeginGetData, searchClient.EndGetData)(searchTerm); 
} 
+0

我認爲最新的位使得FromAsyncPatterns過時了。 – 2013-04-30 00:22:32

+0

我明白了,我仍然瞄準.net 4.0。 – 2013-04-30 03:59:32

2

@Rarous是正確的。一個事件沒有完成的概念,所以FromEventPattern永遠不會完成(或錯誤)。我認爲最喜歡的方法是使用PetarVučetin指定的Task.FromAsync.ToObservable,然後考慮Rarous指定的FromAsyncPattern。如果你真的想,你可以通過使它看起來像這樣來糾正你的代碼。

private IObservable<List<string>> Search(string searchTerm) 
{ 
    return Observable.Create<List<string>>(o => 
    { 
     var searchClient = new SearchServiceClient(); 
     var s = Observable 
      .FromEventPattern<SearchCompletedEventArgs>(searchClient, "SearchCompleted"); 
     var subscription = s.Subscribe(
      r => 
      { 
       if (r.EventArgs.Error == null) 
       { 
        o.OnNext(r.EventArgs.Result); 
        o.OnCompleted(); 
       } 
       else 
       { 
        o.OnError(r.EventArgs.Error); 
       } 
      }); 
     searchClient.SearchAsync(searchTerm); 
     return subscription; 
    }); 
}