나는이 코드가 내 컨트롤 내부RX 스로틀
(A 자동 완성 컨트롤을하려고) 내 템플릿 기반 컨트롤에서 스레드 동기화 몇 가지 문제가 있습니다
protected override void OnApplyTemplate()
{
base.OnApplyTemplate();
var searchTextBox = GetTemplateChild("SearchTextBox") as TextBox;
if (searchTextBox != null)
{
var searchDelegate = SearchAsync;
Observable.FromEventPattern(searchTextBox, "TextChanged")
.Select(keyup => searchTextBox.Text)
.Where(TextIsLongEnough)
.Throttle(TimeSpan.FromMilliseconds(500))
.Do(ShowProgressBar)
.SelectMany(searchDelegate)
.ObserveOn(Dispatcher)
.Subscribe(async results => await RunOnDispatcher(() =>
{
IsInProgress = false;
SearchResults.Clear();
foreach (var result in results)
{
SearchResults.Add(result);
}
}));
}
}
을 그리고 그것은 불평 내 ShowProgressBar 메서드 내에서 다른 스레드에 의해 마샬링 된 코드에 액세스하려고합니다.
Throttle과 ObserveOn (Dispatcher)을 주석 처리하면 정상적으로 작동하지만 원하는대로 내 서비스 호출을 차단하지 않습니다.
스로틀 부분 만 주석 처리하면 아무 일도 일어나지 않습니다.
나는 RX 2.0 베타를 사용하고있다. – David
이것은 대답이 아니지만 빠른 주석이다 - 나는 당신이 당신의 코드에서'async' /'await'을 필요로하지 않는다고 생각한다. Rx가 효과적으로 당신을 기다리고 있습니다. 하지 않고 그것을 시도하고 여전히 잘 작동하는지 알려주십시오. – Enigmativity
True Enigmativity - 코드가 비동기/작동하지 않고 작동합니다. – David