自动完成:使用线程与WCF进行异步填充

本文关键字:WCF 填充 异步 线程 | 更新日期: 2023-09-27 18:08:11

我有一个"自动完成"文本框,每次按下一个键时都会调用一个WCF方法。反过来,WCF服务器将运行一个SQL查询,返回前15个结果并发送它们。但是,当在框中输入时,这会导致明显的延迟。

我要做的是:

    当text_changed事件被触发时创建一个新线程,使用Stopwatch.ElapsedMilliseconds让该线程等待1000ms。在此等待时间内,线程可以永久停止。
  • 如果没有停止,线程将发送请求到服务器(并重新填充自动完成框)。
  • 一旦一个新的"text_changed"事件被触发,我将停止当前线程并开始一个新的。

是否有更好的方法,或者这是要走的路?

自动完成:使用线程与WCF进行异步填充

所以在请求结果之前,基本上等待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。