우선 가장 최근의 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
에 관해 생각하고있는 것처럼 보인다. 친절하게도 제 잘못을 지적 해 주시겠습니까?
붙여 넣은 그 코드, 그것은에서 실행? 폼/컨트롤 내부? (기본적으로 "실제로 UI 스레드에서 실행됩니까?") – JerKimball
네, 실제로 UI 스레드에서 실행됩니다. 이 페이지의 생성자입니다. – Haspemulator