private static async Task AcceptMany(TcpListener tcpListener, int howMany)
{
List<WeakReference<Task>> waitingFor = new List<WeakReference<Task>>();
for (int i = 1; howMany == 0 || i <= howMany; i++)
{
Console.WriteLine("Waiting for {0}", i);
Stopwatch sw = new Stopwatch(); sw.Start();
var listener = await tcpListener.AcceptSocketAsync();
sw.Stop();
Console.WriteLine("Accepted {0} in {1} milliseconds", i, sw.ElapsedMilliseconds);
//var workTask = WorkWith(i, listener);
//if (!workTask.IsCompleted) waitingFor.Add(new WeakReference<Task>(workTask));
}
Console.WriteLine("Maximum requests processed. Waiting for them to finish");
var toWaitFor = waitingFor.Select(x =>
{
Task tsk;
if (!x.TryGetTarget(out tsk))
{
Console.WriteLine("Failed to get task");
}
return tsk;
}).Where(x => x != null && !x.IsCompleted);
await Task.WhenAll(toWaitFor);
}