【问题标题】:Autocomplete: Asynchronous population with WCF using threads自动完成:使用线程的 WCF 异步填充
【发布时间】:2013-04-10 03:05:58
【问题描述】:

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

我要做的是:

  • 当触发 text_changed 事件时创建一个新线程,使用 Stopwatch.ElapsedMilliseconds 使该线程等待 1000 毫秒。在这段等待时间内,线程可以永久停止。
  • 如果没有停止,线程会将请求发送到服务器(并重新填充自动完成框)。
  • 一旦触发了新的“text_changed”事件,我将停止当前线程并启动一个新线程。

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

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

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

    这是节省服务器资源的好解决方案,但实际上通过让用户等待至少 1000 毫秒来增加延迟。

    我的猜测是您最初的问题是这是一个 winforms 应用程序,并且您发出的请求默认是同步的。结果,当应用程序等待响应时,文本框不接受用户输入。只需使调用异步就可以解决该问题,而不会使输入速度变慢。

    【讨论】:

    【解决方案2】:

    另一种方法是使用 Rx (Reactive Extensions) 框架来封装具有一些非常有趣的特性的 automplete。

    使用 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 并使用代理 Beginxxx Endxxx 方法来代替 FromEvent。

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2014-09-12
      • 2015-06-14
      • 1970-01-01
      相关资源
      最近更新 更多