2013-04-09 32 views
3

我有一個「自動完成」文本框,每次按下某個鍵時都會調用WCF方法。 WCF服務器反過來會運行一個SQL查詢,返回前15個結果併發送它們。 但是,這會導致在框中輸入時顯着的延遲。自動完成:WCF使用線程的異步填充

我即將做的,而不是這是什麼:

  • 創建一個新的線程,當text_changed事件被觸發,使用Stopwatch.ElapsedMilliseconds使該線程等待1000毫秒。在這段等待時間內,線可以永久停止。
  • 如果未停止,線程會將請求發送到服務器(並重新填充自動完成框)。
  • 只要發生新的「text_changed」事件,我將停止當前線程並啓動一個新線程。

有沒有更好的方法或者這是要走的路?

回答

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); 

相反FromEvent,你可以用FromAsync和使用代理Beginxx x Endxxx方法。

1

因此,基本上等待1秒讓用戶在請求結果前停止鍵入。

這是一個節省服務器資源的好方法,但實際上通過讓用戶等待至少1000毫秒來增加延遲。

我的猜測是你的原始問題是這是一個winforms應用程序,並且你所做的請求是默認同步的。因此,當應用程序正在等待響應時,文本框不接受用戶輸入。只是讓調用異步應該可以解決這個問題,而不會讓輸入變慢。

+0

我明白了。有沒有任何選項可以使WCF調用異步? – David 2013-04-09 17:11:22

+0

這裏有幾個鏈接例子:http://stackoverflow.com/questions/781932/async-call-to-wcf-with-c – LouD 2013-04-09 18:13:32

+0

一些直接的WCF鏈接在這裏:http://msdn.microsoft.com/ en-us/library/ms730059.aspx,http://code.msdn.microsoft.com/windowsdesktop/How-to-Implement-a-WCF-2090bec8 – LouD 2013-04-09 18:20:47