using System; using System.Threading; using System.Threading.Tasks; namespace Umbraco.Web.Scheduling { internal static class TaskAndFactoryExtensions { #region Task Extensions static void SetCompletionSource(TaskCompletionSource completionSource, Task task) { if (task.IsFaulted) completionSource.SetException(task.Exception.InnerException); else completionSource.SetResult(default(TResult)); } static void SetCompletionSource(TaskCompletionSource completionSource, Task task) { if (task.IsFaulted) completionSource.SetException(task.Exception.InnerException); else completionSource.SetResult(task.Result); } public static Task ContinueWithTask(this Task task, Func continuation) { var completionSource = new TaskCompletionSource(); task.ContinueWith(atask => continuation(atask).ContinueWith(atask2 => SetCompletionSource(completionSource, atask2))); return completionSource.Task; } public static Task ContinueWithTask(this Task task, Func continuation, CancellationToken token) { var completionSource = new TaskCompletionSource(); task.ContinueWith(atask => continuation(atask).ContinueWith(atask2 => SetCompletionSource(completionSource, atask2), token), token); return completionSource.Task; } #endregion #region TaskFactory Extensions public static Task Completed(this TaskFactory factory) { var taskSource = new TaskCompletionSource(); taskSource.SetResult(null); return taskSource.Task; } public static Task Sync(this TaskFactory factory, Action action) { var taskSource = new TaskCompletionSource(); action(); taskSource.SetResult(null); return taskSource.Task; } #endregion } }