Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动完成:使用线程使用WCF异步填充_C#_.net_Wcf - Fatal编程技术网

C# 自动完成:使用线程使用WCF异步填充

C# 自动完成:使用线程使用WCF异步填充,c#,.net,wcf,C#,.net,Wcf,我有一个“autocomplete”文本框,每次按下一个键时都会调用WCF方法。 WCF服务器将依次运行SQL查询,返回前15个结果并发送它们。 但是,这会导致在框中键入时出现明显的延迟 我要做的是: 当触发文本更改事件时,创建一个新线程,使用Stopwatch.elapsedmillesons使该线程等待1000毫秒。在此等待时间内,线程可以永久停止 如果未停止,线程将向服务器发送请求(并重新填充自动完成框) 一旦触发新的“text_changed”事件,我将停止当前线程并启动一个新线程

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

我要做的是:

  • 当触发文本更改事件时,创建一个新线程,使用Stopwatch.elapsedmillesons使该线程等待1000毫秒。在此等待时间内,线程可以永久停止
  • 如果未停止,线程将向服务器发送请求(并重新填充自动完成框)
  • 一旦触发新的“text_changed”事件,我将停止当前线程并启动一个新线程

有更好的方法吗?或者这是一种方法吗?

因此,在请求结果之前,基本上要等待1秒,让用户停止键入

这是一个很好的节省服务器资源的解决方案,但实际上您让用户等待至少1000毫秒,这增加了延迟


我猜您最初的问题是这是一个winforms应用程序,您发出的请求在默认情况下是同步的。因此,当应用程序等待响应时,文本框不接受用户输入。只要使调用异步,就可以解决这个问题,而不会使键入速度变慢。

另一种方法是使用Rx(反应式扩展)框架封装AutoComplete,并具有一些非常有趣的特性

使用Rx,您可以合成(多个事件源),限制用户输入,这样您就不会压倒源,此外,如果用户在搜索框中键入更多内容,您还可以忽略旧结果(TakeUntil)

更多信息:

例如:

RxProperty=Observable.FromEvent(
h=>新的文本更改控制器(h),
h=>AssociatedObject.TextChanged+=h,
h=>AssociatedObject.TextChanged-=h)
.选择(t=>((文本框)t.Sender).Text)
.节气门(时间跨度从毫秒(400))
.SubscribeOnDispatcher()
.Take(10)
.TakeUntil(AssociatedObject.TextChanged);

您可以使用FromAsync和proxy Beginxxx Endxxx方法代替FromEvent。

我明白了。有没有使WCF调用异步的选项?这里有几个链接,并附有示例:这里有一些直接WCF链接:,
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 );