Поскольку любой Task
может порождаться любым кодом .NET (например, BCL, некоторой библиотекой и т. Д.), Вы, вероятно, не хотите ждать выполнения всех задач, которые ожидают выполнения, а только тех, которые есть в вашем собственном коде. создано. Самый простой способ - создать собственную фабрику, которая использует базовую фабрику, которая отслеживает все незавершенные задачи и предоставляет нужные функции ожидания
public class MyTaskFactory {
private HashSet<Task> _tasks = new HashSet<Task>();
public Task<T> StartNew<T>(Func<T> func) {
var t = Task.Factory.StartNew(func);
t.ContinueWith(x => {
lock(_tasks) {
_tasks.Remove(x);
}
});
lock(_tasks) {
_tasks.Add(t);
}
return t;
}
// ... implement other StartNew overrides ...
public void WaitAll() {
Task[] tasks;
lock(_tasks) {
tasks = _tasks.ToArray();
}
Task.WaitAll(tasks);
}
}