自动完成:使用线程与WCF进行异步填充
本文关键字:WCF 填充 异步 线程 | 更新日期: 2023-09-27 18:08:11
我有一个"自动完成"文本框,每次按下一个键时都会调用一个WCF方法。反过来,WCF服务器将运行一个SQL查询,返回前15个结果并发送它们。但是,当在框中输入时,这会导致明显的延迟。
我要做的是:
- 当text_changed事件被触发时创建一个新线程,使用Stopwatch.ElapsedMilliseconds让该线程等待1000ms。在此等待时间内,线程可以永久停止。
- 如果没有停止,线程将发送请求到服务器(并重新填充自动完成框)。
- 一旦一个新的"text_changed"事件被触发,我将停止当前线程并开始一个新的。
是否有更好的方法,或者这是要走的路?
所以在请求结果之前,基本上等待1秒让用户停止输入。
对于节省服务器资源来说,这是一个很好的解决方案,但是你实际上增加了延迟,因为你让用户等待至少1000ms。
我的猜测是,你原来的问题是,这是一个winforms应用程序,你的请求是默认同步的。结果,当应用程序等待响应时,文本框不接受用户输入。只要使调用异步就可以解决这个问题,而不会使输入变慢。
另一种方法是使用Rx (Reactive Extensions)框架来封装带有一些非常有趣特征的complete。
使用Rx,你可以组合(多个事件源),限制用户输入,这样你就不会淹没源,最重要的是,如果用户在搜索框中输入更多,你可以忽略旧的结果(TakeUntil)。
更多信息:
Rx:治愈你的异步编程烦恼
使用。net的响应式扩展解决异步问题
的例子:
SO: RX AutoCompleteBox
RxProperty = Observable.FromEvent<TextChangedEventHandler, TextChangedEventArgs>(
h => new TextChangedEventHandler(h),
h => AssociatedObject.TextChanged += h,
h => AssociatedObject.TextChanged -= h)
.Select(t => ((TextBox)t.Sender).Text)
.Throttle(TimeSpan.FromMilliseconds(400))
.SubscribeOnDispatcher()
.Take(10)
.TakeUntil(AssociatedObject.TextChanged );
你可以使用FromAsync和代理Beginxxx Endxxx方法代替FromEvent。