Сделайте, чтобы ваш главный поток создал поток менеджера. Вы можете использовать BackgroundWorker для этого. Этот поток менеджера запускает рабочий поток для каждого элемента в ListView. Это позволит вашему пользовательскому интерфейсу продолжать отвечать на вводимые пользователем данные без зависаний, пока обрабатываются фоновые потоки.
Теперь проблема в том, как ждать завершения каждого рабочего потока. К сожалению, мне не удалось найти способ получить дескриптор потока для System.Threading.Thread
объектов. Я не говорю, что нет способа сделать это; Я просто не нашел ни одного. Еще один сложный аспект этого заключается в том, что класс System.Threading.Thread
запечатан, поэтому мы не можем извлечь из него какой-то «дескриптор».
Здесь я использую ManualResetEvent .
Скажем, каждый рабочий поток - это просто ThreadPool
поток. Управляющий BackgroundWorker
создает объект ManualResetEvent
для каждого элемента в ListView. Когда BackgroundWorker
запускает каждый поток ThreadPool
, передайте ManualResetEvent
в качестве аргумента функции QueueUserWorkItem
. Затем, перед каждым выходом из потока ThreadPool
, установите объект ManualResetEvent
.
Поток BackgroundWorker
может затем поместить все объекты ManualResetEvent
в массив и ожидать этого массива, используя WaitHandle.WaitXXX
функции . По завершении каждого потока вы можете использовать события BackgroundWorker
для обновления пользовательского интерфейса или метод Control.Invoke()
для обновления пользовательского интерфейса (см. Ответ Марка Гравелла здесь ).
Надеюсь, это поможет.