view Implab/TaskHelpers.cs @ 266:254d1f255d87 v3

Добавлена метка v3.0.10 для набора изменений 74e048cbaac8
author cin
date Mon, 16 Apr 2018 19:45:18 +0300
parents 7c7e9ad6fe4a
children
line wrap: on
line source

using System;
using System.Threading.Tasks;

namespace Implab {
    public static class TaskHelpers {

        public static async Task Then(this Task that, Action fulfilled, Action<Exception> rejected) {
            Safe.ArgumentNotNull(that, nameof(that));
            if (rejected != null) {
                try {
                    await that;
                } catch (Exception e) {
                    rejected(e);
                    return;
                }
            } else {
                await that;
            }

            if (fulfilled != null)
                fulfilled();
        }

        public static async Task Then(this Task that, Action fulfilled) {
            Safe.ArgumentNotNull(that, nameof(that));
            await that;
            if (fulfilled != null)
                fulfilled();
        }

        public static async Task Then(this Task that, Func<Task> fulfilled) {
            Safe.ArgumentNotNull(that, nameof(that));
            await that;
            if (fulfilled != null)
                await fulfilled();
        }

        public static async Task Finally(this Task that, Action handler) {
            Safe.ArgumentNotNull(that, nameof(that));
            try {
                await that;
            } finally {
                if (handler != null)
                    handler();
            }
        }

        public static async void Then(this Task that, IResolvable next) {
            try {
                await that;
            } catch (Exception e) {
                next.Reject(e);
                return;
            }
            next.Resolve();
        }

        public static async void Then<T>(this Task<T> that, IResolvable<T> next) {
            T result;
            try {
                result = await that;
            } catch (Exception e) {
                next.Reject(e);
                return;
            }
            next.Resolve(result);
        }

    }
}