自动完成:使用线程异步填充WCF的自动完成功能

3
我有一个“自动完成”文本框,每次按键时都会调用一个WCF方法。 WCF服务器将运行一个SQL查询,返回前15个结果并发送它们。然而,这会导致在文本框中输入时出现明显的延迟。
我打算改为以下做法:
  • 在text_changed事件被触发时创建一个新线程,并使用Stopwatch.ElapsedMilliseconds等待1000毫秒。在此等待时间期间,线程可以被永久停止。
  • 如果没有被停止,线程将向服务器发送请求(并重新填充自动完成框)。
  • 一旦触发新的“text_changed”事件,我将停止当前线程并启动一个新线程。
是否有更好的方法或者这是正确的方式?
2个回答

1

基本上,在请求结果之前,等待用户停止输入1秒钟。

这是保留服务器资源的好方法,但实际上你增加了延迟,使用户至少等待1000毫秒。

我猜想你最初的问题是这是一个WinForms应用程序,你所做的请求默认是同步的。因此,当应用程序等待响应时,文本框不接受用户输入。只需要将调用异步化,即可解决该问题,而不会使打字变慢。


我明白了。有没有选项可以使WCF调用变成异步的? - David
这里有一些示例链接:https://dev59.com/hUfRa4cB1Zd3GeqP8FJ4 - LouD
以下是一些直接的 WCF 链接:http://msdn.microsoft.com/zh-cn/library/ms730059.aspx,http://code.msdn.microsoft.com/windowsdesktop/How-to-Implement-a-WCF-2090bec8 - LouD

0

另一种方法是使用 Rx (Reactive Extensions) 框架来封装自动完成功能,具有一些非常有趣的特性。

使用 Rx 可以组合(多个事件源),限制用户输入以避免源过载,并且您还可以忽略旧结果,如果用户在搜索框中键入更多内容(TakeUntil)。

更多信息:

Rx: Curing your asynchronous programming blues

Curing the asynchronous blues with the Reactive Extensions for .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而不是FromEvent,并使用代理Beginxxx Endxxx方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接