Предположим, что у нас есть некоторые методы, которые выполняют большую работу.Очередь нескольких задач с обратным вызовом
Первоначально мы не знаем, сколько методов существует (может быть 1 и может быть 10).
В коде это выглядит следующим образом:
public interface IWorker
{
void DoWork(DataContainer data);
}
И несколько классов, которые реализуют этот интерфейс. Затем у нас есть список экземпляров.
List<IWorker> workers = new List<IWorker>();
Я хочу использовать эти методы асинхронно. Кроме того, я хочу получить обратный вызов, когда все они будут выполнены.
public void Callback()
{
Console.WriteLine("everything done");
}
Есть ли способ сделать это без написания пользовательских оберток или так? С ThreadPool, Tasks, Parallel?
Как я знаю, поток блоков Parrallel до тех пор, пока задачи не будут завершены, поэтому это не преферирование.
При создании задачи должен быть метод без параметров, как я видел, так что это тоже не хорошо.
В ThreadPool есть возможность использовать метод QueueUserWorkItem, но с помощью этого метода я не получу один обратный вызов полного завершения.
Конечно, я могу создать свою собственную оболочку, которая будет реализовывать желаемую функциональность с помощью ThreadPool, но цель состоит в том, чтобы сделать это без написания такого.
Помогите пожалуйста? Спасибо.
Да, это звучит хорошо, но задача в его конструкторе ждет метода без входных параметров. И мои методы имеют такой. – steavy
@steavy Нет необходимости вводить параметры ввода в задачу, потому что вам не нужно планировать задачу после ее создания, в других работах нет необходимости, чтобы планировщик задач имел что-либо, чтобы предоставить делегат. Вместо этого просто закройте любые переменные, которые могут потребоваться в качестве параметров для вашей функции, используя лямбда, а не передавая значения напрямую. – Servy
спасибо. Поскольку вы были первым, кто предложил Task.WhenAll обозначил как правильный ответ :) – steavy