2010-02-15 30 views
3

我需要在線程中放置一些ListView填充代碼。對於簡單的情況,這個線程不應該運行兩次。當我想要發佈新線程時,以前需要停止,不管做什麼。如何在c#中填充線程安全ListView?

EDIT 1

的場景是以下內容。
我在ListView上方有一個文本過濾器。在textchange上我調用了一個populateList()方法。
問題是,代碼可能需要更長的時間,因爲它在更大的數據庫上使用SQL LIKE語法。

在運行之前,用戶不能輸入任何內容。所以當你輸入「abc」時,會出現嚴重的問題,你只能在10秒後輸入「c」。

所以我心裏有問題線程的populateList()方法,並允許用戶快速輸入更多的東西。文本越慢,SQL查詢就越慢。 在「abc」情況下,如果鍵入「a」代碼後退並運行查詢,但與此同時,如果用戶按下「b」,我想停止執行「a」線程並立即發出新線程使用「ab」...等等與「c」。

EDIT 2

還在尋找更多的答案。

回答

1

我不知道我是否得到了正題吧......如果你正在處理多個線程,由於某種原因要停止前一個線程,可以在新線程檢查前一個線程是否還活着,並放棄其行爲突然...如果這不是你所期望的,請你詳細說明你的問題?

更新:
現在我明白你的問題了。即使我正在處理這樣的問題,但數據庫正在內存中。在你的情況,如果你的數據庫支持LIMIT,那麼你可以限制使用

LIMIT LOWERLIMIT UPPERLIMIT

現在,在你的線程的方法從查詢返回結果數量,使用「的」循環通過結果集並在每次迭代中檢查文本框文本是否已更改。如果它改變了,那麼打破循環,清除列表,轉到線程方法的開始,並使用相同的線程執行相同的過程,但textfilter不同。

僞代碼:

do 
    isLoop = false 
    clear the collection that is bound to the listbox 
    from db, get the record count  
    for: loop 0 to recordcount increment batchsize 
     get chuncks of data from db of size batchsize 
     add the data to collection [using dispatcher.invoke] 
     if textbox text changed 
     isLoop = true 
     break for-loop 
     endif 
    endfor 
while(isLoop) 

希望這有助於。

+0

看到我的編輯問題 – Pentium10 2010-02-16 12:30:41

+0

我會試試這個,但我不知道我是否能夠檢測到循環中的變化,因爲事件接縫僅在人口過程完成後觸發。我會看看。 – Pentium10 2010-02-17 11:54:57

+0

嗨奔騰,剛試過。有用。讓我知道它是否也適用於您。檢查我編輯的僞代碼 – Amsakanna 2010-02-20 19:50:24