Сохранить глобальный счетчик рабочих элементов в очереди и объект для его защиты:
int runningTasks = 0;
object locker = new object();
Каждый раз, когда добавляется задача, увеличивается счетчик:
lock(locker) runningTasks++;
System.Threading.ThreadPool.QueueUserWorkItem(x => MyMethod(param1, param2, param3, param4, param5));
В конце MyMethod
уменьшить счетчик и дать сигнал основному потоку:
lock(locker)
{
runningTasks--;
Monitor.Pulse(locker);
}
В основном потоке (при условии, что это не поток GUI!):
lock(locker)
{
while(runningTasks > 0)
{
Monitor.Wait(locker);
UpdateGUI();
}
}
Таким образом, у вас также есть барьер для ожидания завершения всех отложенных задач.
Если вы не хотите ждать, просто полностью пропустите основной поток и вызовите UpdateGUI
для пересылки обновлений в поток GUI после завершения MyMethod
.
Обратите внимание , что внутри MyMethod
у вас должна быть какая-то форма Dispatcher.BeginInvoke
(WPF) или Control.BeginInvoke
(WinForms), в противном случае вы не сможете безопасно обновлять графический интерфейс!