2012-12-13 46 views
0

我有一個帶有textbox textchanged事件的應用程序來搜索數據庫中的值。使用sql server連接加快textbox textchanged事件以搜索值

現在它在文本框中輸入的字符真的很慢。 我讀了somone,發生這種情況,因爲它需要爲您在文本框中輸入的每個字符建立一個到數據庫的連接。但我也讀過,所有的sql連接都保持打開在一個池中,所以你可以再次使用它們。 (所以如果泳池的事情是真的,那麼它應該是快的嗎?)

解決方案我實施了一個計時器,以便我知道用戶什麼時候停止鍵入,然後搜索數據庫,因此它只有1個連接。速度還是不錯的,當我打字,而是因爲它現在來到另一個線程我需要實現這個規則在Page_Load中

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False 

,但現在我得到的所有類型的誤差對datagridview的和一些奇怪的行爲,我不明白。

所以我的問題是:是否有另一種解決方案來加速或定時器事件是唯一的。

在此先感謝

+0

爲什麼要對這種複雜的UI?給用戶一個按鈕進行搜索,然後點擊按鈕查找數據庫。或者,如果你的數據庫沒有預先填充組合,然後搜索。 – paragy

回答

1

不使用CheckForIllegalCrossThreadCalls = False!如果你不想阻塞你的UI線程,你必須在後臺運行(時間)昂貴的操作。

Private Sub ExpensiveFoo(s As String) 
    If Me.InvokeRequired Then 
     System.Threading.Thread.Sleep(1000) 
     Me.Invoke(Sub() ExpensiveFoo(s)) 
    Else 
     TextBox2.Text = s 
    End If 


End Sub 


Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged 

    Console.WriteLine(TextBox1.Text) 
    Dim s As String = TextBox1.Text 
    Task.Run(Sub() ExpensiveFoo(s)) 

End Sub 

TextChanged事件現在只是開始task這將做在後臺的一些工作,並在完成後,將更新第二個文本框 - 不使用可怕的CheckForIllegalCrossThreadCalls = False

+0

奧克我試了一下,並把我的數據庫搜索運行查詢在Sub ExpensiveFoo,但再次我會得到錯誤,因爲線程。 – AntoonVs

+0

如果你使用'InvokeRequired'和'Invoke',你將不會得到一個異常。無論執行什麼操作,您都必須確保,以正確的線程運行它。 「調用」(在正確的對象上)就是這樣做的。 – igrimpe

+0

Tanx m8很好的解決方案我從來沒有使用InvokeRequired之前 – AntoonVs

相關問題