2013-02-28 4 views
4

우선 가장 최근의 Rx 인 2.1을 사용하고 있습니다. 내가 이해하는 한, Rx가 2가되었을 때 많은 변화가 있었기 때문에 최신 답변을 기다리고 있습니다. 미리 감사드립니다.Rx 2.1 : Dispatcher에 정확히 등록하고 관찰하는 방법

사용자에게 제안 목록을 제공하기 위해 Rx에 대한 고전적인 작업 인 TextBox (WPToolkit의 AutoCompleteBox를 정확히 관찰)를 관찰합니다. 네트워크에서 제안을 가져오고 Throttle, DistinctUntilChanged 등과 같은 일반적인 Rx 기능을 사용하고 싶습니다.

또한 작업 기반 비동기 API를 제공하므로 최근 출시 된 Windows Phone 8 용 HttpClient도 사용하고 있습니다. , 그것은 멋지다.

Text 'AutoCompleteBox'값을 읽는 동안 내가 겪고있는 문제는 크로스 스레드 액세스입니다. 다음은 코드입니다.

var http = new HttpClient(); 
var searchFunc = Observable.FromAsync<HttpResponseMessage>(() => 
      http.GetAsync(FormatUrl(SEARCH_URL, "DE", new GeoCoordinate(51, 13), searchBox.Text /* <-- causes exception */, 10, ""))); 

var uithread = new SynchronizationContextScheduler(SynchronizationContext.Current); 
var textChange = Observable.FromEventPattern<RoutedEventArgs>(searchBox, "TextChanged")        
     .Throttle(TimeSpan.FromMilliseconds(800)) 
     .DistinctUntilChanged()  
     .SubscribeOn(uithread)   
     .SelectMany(searchFunc)     
     .Select(async (resp) => SearchResultsParser.ParseSearchResults(await resp.Content.ReadAsStreamAsync(), new GeoCoordinate(51, 13))) 
     .Select(async (results) => searchBox.ItemsSource = await results) 
     .ObserveOn(uithread) 
     .Subscribe(); 

searchFunc이 실행될 때 예외가 발생합니다. 내가 VS에서 그것은 내가 SubscOn을 사용 함에도 불구하고 Worker Thread에서 실행된다는 것을 알 수있다.

여기에 SynchronizationContextScheduler을 사용하는 예가 나와 있지만, 같은 결과로 SubscribeOnDispatcher도 시도했습니다. 내가이 ObserveOn 물건으로 중요한 무엇인가 놓치고 있거나, Observable.FromAsync에 관해 생각하고있는 것처럼 보인다. 친절하게도 제 잘못을 지적 해 주시겠습니까?

+0

붙여 넣은 그 코드, 그것은에서 실행? 폼/컨트롤 내부? (기본적으로 "실제로 UI 스레드에서 실행됩니까?") – JerKimball

+0

네, 실제로 UI 스레드에서 실행됩니다. 이 페이지의 생성자입니다. – Haspemulator

답변

8

SubscribeOn거의 결코 당신이 원하는 무엇 - 당신은 의미 생각 "어디에 Subscribe 방법 실행"그러나 "는 IDisposable (폐기) 실행의 실제 배선 여기서"실제로 의미 - ObserveOn은 동일합니다 에 대해 "이것은 내 실제 Subscribe 코드가 실행하려는 곳이다"

참조 : Observable.SubscribeOn and Observable.ObserveOn

+0

불행한 이름입니다. – Contango