/// <summary>
 /// Calls Task.Run<T>() with a proper CancellationToken.
 /// </summary>
 public static Task <TSource> RunTask <TSource> (this AsyncTask asyncTask, Func <TSource> body) =>
 Task.Run(body, asyncTask.CancellationToken);
 static void LogErrorAndCancel(AsyncTask asyncTask, Exception exc)
 {
     asyncTask.LogCodedError("XA0000", "Unhandled exception: {0}", exc);
     asyncTask.Cancel();
 }
 /// <summary>
 /// Calls Task.Run() with a proper CancellationToken.
 /// </summary>
 public static Task RunTask(this AsyncTask asyncTask, Action body) =>
 Task.Run(body, asyncTask.CancellationToken);
 static ParallelOptions ParallelOptions(AsyncTask asyncTask) => new ParallelOptions
 {
     CancellationToken = asyncTask.CancellationToken,
     TaskScheduler     = TaskScheduler.Default,
 };