public Task(TaskRunner runner, Action<Task> action) { new System.Threading.Tasks.Task(delegate() { try { action(this); } catch(Exception ex) { if (runner.ExceptionThrown != null) runner.ExceptionThrown(runner, ex); } finally { lock (runner) { if (runner.m_Task == this) { runner.m_Task = null; } } } }).Start(); }