2013-04-25 4 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"); 
        }); 

그러나 그것은 결코 완성 된 블록에 도달하지 않습니다. 내가 어디로 잘못 가고 있는지 제안 해 주시겠습니까? 26

감사 페 타르 Vučetin, Rarous 리 캠벨에

@Edited. 세 가지 제안을 모두 테스트했으며 모두 작동합니다. 하지만 나는 Petar의 접근법이 한 줄의 코드에만 의존하는 것을 좋아한다. Observable 인 것처럼 보이지만 AsynchronousPatterns는 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를 쓸모 없게 만든다고 생각합니다. –

+0

나는 여전히 .net 4.0을 타겟팅하고있다. –

2

@Rarous가 올바른지. 이벤트에는 완료 개념이 없으므로 FromEventPattern은 완료되지 않습니다 (또는 오류). Petar Vuč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; 
    }); 
} 
관련 문제