using System.Threading.Tasks;
using System.Collections.Generic;
Console.WriteLine("Main called");
var tasks = new List<Task>();
for( int i = 0; i < 5; i++ )
Console.WriteLine("Main working");
System.Threading.Thread.Sleep(20);
await ReleaseAsync(tasks);
foreach( var task in tasks )
Console.WriteLine("Main ending");
public async Task ReleaseAsync(List<Task> TaskList)
var taskSet = new HashSet<Task>(TaskList);
while (taskSet.Any()) taskSet.Remove(await Task.WhenAny(taskSet));
public async Task ReleaseAsync(params Task[] TaskArray)
var taskSet = new HashSet<Task>(TaskArray);
while (taskSet.Any()) taskSet.Remove(await Task.WhenAny(taskSet));
public async Task<int> Fire()
using( var db = new Context() )
return await db.Working();
public class Context : IDisposable
Console.WriteLine("open");
public async Task<int> Working()
return await Task.Run(() => {
Console.WriteLine("work started");
System.Threading.Thread.Sleep(20);
throw new Exception("work broke");
Console.WriteLine("work complete");
Console.WriteLine("dispose");