Как заполнить потокобезопасный ListView в C #? - PullRequest
3 голосов
/ 15 февраля 2010

Мне нужно поместить какой-нибудь код ListView в поток. Для простого случая этот поток не должен запускаться дважды. Когда я хочу выпустить новый поток, предыдущий должен остановиться, что бы он ни делал.

РЕДАКТИРОВАТЬ 1

Сценарий следующий.
У меня есть текстовый фильтр над ListView. При обмене текстами я вызываю метод populateList ().
Проблема в том, что код может занять больше времени, так как он использует синтаксис SQL LIKE в большой базе данных.

Пока это не запустится, пользователь не может ничего вводить. Таким образом, при наборе «abc» возникает несколько зависаний, вы набираете «c» только через 10 секунд.

Так что я имею в виду выпуск метода populateList () в потоке и возможность пользователю быстро вводить что-то большее. Чем длиннее текст, тем медленнее выполняется запрос SQL. В ситуации «abc», если вы набираете «a», код идет позади и выполняет запрос, но между тем, если пользователь нажал «b», я хочу остановить выполнение потока «a» и выпустить новый, теперь используя "ab" ... и так далее с "c".

РЕДАКТИРОВАТЬ 2

Все еще ищите больше ответов.

1 Ответ

1 голос
/ 16 февраля 2010

Не знаю, правильно ли я понял вопрос ... Если вы имеете дело с несколькими потоками и по какой-то причине хотите прекратить предыдущую тему, вы можете проверить в новой теме, жив ли предыдущий поток, и отказаться от его. действие внезапно ... Если это не то, что вы ожидаете, не могли бы вы подробно описать свой вопрос?

Обновление:
Теперь я очень хорошо поняла ваш вопрос. Даже я работаю над такой проблемой, но БД находится в памяти. В вашем случае, если ваша БД поддерживает LIMIT, вы можете ограничить количество результатов, возвращаемых запросом, используя

LIMIT lowerLimit upperLimit

Теперь в методе вашего потока используйте 'for' для циклического просмотра наборов результатов и в каждой итерации проверяйте, изменился ли текст текстового поля. Если он был изменен, то прервите цикл, очистите список, перейдите к началу метода потока и выполните тот же процесс, используя тот же поток, но текстовый фильтр отличается.

КОД PSEUDO:

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)

Надеюсь, это поможет.

...