Вот простая программа, которая демонстрирует, как вы можете использовать Task Parallel Library для вызова ваших асинхронных функций и ожидания завершения всех. Затем вы можете адаптировать свой код, чтобы сделать то же самое.
class Program
{
static void Main(string[] args)
{
var asyncFunc = new Action<int>(i =>
{
Thread.Sleep((i+1) * 1000);
Console.WriteLine("Called {0}!", i);
});
var callback = new Action(() => Console.WriteLine("Callback called"));
var requests = Enumerable.Range(0, 5)
.Select(i =>
{
return Task.Factory
// wrap asynchronous call in a task
.FromAsync(asyncFunc.BeginInvoke, asyncFunc.EndInvoke, i, asyncFunc)
// register callback
.ContinueWith(_ => callback());
})
.ToArray();
Task.WaitAll(requests);
// do callback
Console.WriteLine("All called!");
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
Console.WriteLine();
}
}
Не видя, как реализована ваша асинхронная функция, я могу только предположить, что вам нужно изменить ее, чтобы она возвращала асинхронный вызов как задачу, чтобы эта работа работала. Возможно, что-то вроде этого будет работать для вас:
Task requestSomething(Action callback)
{
// do stuff...
return Task.Factory
.FromAsync(obj.BeginInvoke,
obj.EndInvoke,
..., // async func arguments
obj)
.ContinueWith(_ => callback());
}
// usage:
var tasks = Enumerable.Range(0, 5)
.Select(_ => requestSomething(singleCallback))
.ToArray();
Task.WaitAll(tasks);
mainCallback();