2014-11-24 223 views
-1

在我的Windows窗體應用程序中,我有一種方法可以搜索從包含大約150,000字的SortedDictionary在搜索框中輸入的文本,然後將結果添加到列表框中。在我的searchBox_TextChanged事件處理程序中,我正在創建一個新線程並啓動它,但根本不起作用。在單線程版本中,我的應用程序正在運行,但速度有點慢。我希望搜索更快。C#中的多線程無法啓動

private void searchAllWords() 
{ 
    if (searchBox.Text.Length > 0) 
    { 
     var match = allWords.Keys.Where(x => x.StartsWith(searchBox.Text.Trim().ToLower())).ToArray(); 
     listBoxWords1.Items.AddRange(match);     
    } 
} 

private void searchBox_TextChanged(object sender, EventArgs e) 
{ 
    listBoxWords1.Items.Clear(); 
    Thread searchThread = new Thread(new ThreadStart (searchAllWords)); 
    searchThread.Start();    
}   

我知道某個地方線程應該被殺死,但是在哪裏以及如何?

回答

1

您的代碼有幾個問題。

  • 您正在訪問工作線程中的UI,這是不合法的。
  • 每次創建新線程TextChanged都會觸發並忘記之前創建的線程。
  • 您正在使用錯誤的數據結構。

如果你使用正確的工具,那麼你並不需要一個線程都沒有。您應該使用Trie數據結構來搜索以預期字符串開頭的項目。

請參閱我的相關答案here for C#implementation of the same。

+0

雖然這不是規則說謝謝,但我想特別說一聲謝謝。我真的有工作。正如我所想。 雖然這對我來說有點實施,但我做到了。 謝謝 – Hadi 2014-11-24 19:09:51

+0

@哈迪不客氣。樂於幫助.. – 2014-11-24 19:11:12

+0

我注意到我的搜索引擎有問題。我已經實現的基本思想是:在searchBox_TextChaned事件處理程序中,我實現了將最後一個字符作爲NextMatch傳遞給Matcher。例如,如果我輸入'compute'直到找到以'compute'開頭的所有單詞,然後如果輸入'r',那麼'r'將作爲NextMatch的字符傳遞,並且將找到以'computer'開頭的所有單詞,但再次當我刪除'r'時,'e'作爲NextMatch的字符傳遞,但我想要以'compute'開頭的所有單詞的列表。請提出任何提示? – Hadi 2014-11-25 08:03:42