Как лучше всего определять, когда обрабатывается целая группа потоков? У меня есть процесс, который будет запрашивать [долго работающий] веб-сервис для произвольного числа объектов, а затем должен предпринять транзакционное действие, когда все они будут успешно завершены. В настоящее время я запускаю их асинхронно, используя делегатов из пула потоков .Net. Запуск их синхронно, побеждает цель запуска их в нескольких потоках ... Как еще я могу определить, когда ВСЕ завершены? Я, хотя и использовал coounter (иначе называемый счетчиком COM), увеличивая его для достижения потока, который запускается и уменьшая его в функции обратного вызова, и сохраняя динамический список со ссылкой на каждый поток в нем, чтобы явно отслеживать каждый из них. как они завершают, но оба эти решения кажутся немного грязными ...
Спасибо всем ... Исходя из ваших предложений и необходимости передать экземпляр объекта в асинхронный поток (представлен ниже переменной ref uPL), я использую следующий код ... ПРИМЕЧАНИЕ: IEEDAL.GetUsagePayloadReadings (uPL1) - вызов удаленной веб-службы
foreach (MeterChannel chgChan in chgChs)
foreach (UsagePayload uPL in chgChan.IntervalPayloads)
{
ManualResetEvent txEvnt = new ManualResetEvent(false);
UsagePayload uPL1 = uPL;
ThreadPool.QueueUserWorkItem(
delegate(object state)
{
if (!uPL1.HasData)
IEEDAL.GetUsagePayloadReadings(uPL1);
UsageCache.PersistPayload(uPL1);
SavePayLoadToProcessFolder(uPL1);
txEvnt.Set();
} );
waitHndls.Add(txEvnt);
}
WaitHandle.WaitAll(waitHndls.ToArray());