Задать вопрос
@Bur-Burito

Есть ли в C# возможность дождаться выполнения всех задач, которые были добавлены в очередь на выполнение в пул потоков?

Есть метод, который при определенном условии сам себя рекурсивно добавляет в очередь на выполнение в ThreadPool-е. Возможно ли как-то оттенить конец выполнения последнего таска в этой очереди?
  • Вопрос задан
  • 350 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
AxianLTD
@AxianLTD
Видимо документацию нынче читать не модно (https://msdn.microsoft.com/en-us/library/system.th...

GetAvailableThreads(Int32, Int32) - Retrieves the difference between the maximum number of thread pool threads returned by the GetMaxThreads method, and the number currently active.

Дальше, надеюсь, догадаешься сам.
Ответ написан
@MonkAlex
C#, SQL, Delphi, C++ etc
В абстрактном понимании - нельзя.
А так - что вам мешает делать это в том же методе, который ставит в очередь? Делаете ContinueWith и пишете обработку на "после выполнения", с обработкой в нужном виде.
Ответ написан
devspec
@devspec
Помогло? Отметь решением
Может, сделать как-то так?

int working_tasks = 0;
ManualResetEventSlim pre = new ManualResetEventSlim(false);

// здесь запуск тасков
// в каждом таске (в начале) ставим working_tasks = Interlocked.Increment(working_tasks);
// в конце - if(Interlocked.Read(working_tasks) == 0) { pre.Set(); }

pre.Wait();

// здесь то, что должно выполняться после выполнения всех тасков


Таким образом, в начале выполнения таска увеличиваем некую переменную на 1, в конце - уменьшаем на 1. Если все таски выполнены (переменная равна 0) - ставим флаг резет-ивента - и начинает выполняться код после pre.Wait().
Не уверен в правильности (писал по памяти), но идея вроде рабочая. Поправьте, если я не прав.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы