using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading.Tasks; namespace System.Xml { internal static class AsyncHelper { public static readonly Task DoneTask = Task.FromResult(true); public static readonly Task DoneTaskTrue = Task.FromResult(true); public static readonly Task DoneTaskFalse = Task.FromResult(false); public static readonly Task DoneTaskZero = Task.FromResult(0); public static bool IsSuccess(this Task task) { return task.IsCompleted && task.Exception == null; } public static Task CallVoidFuncWhenFinish(this Task task, Action func) { if (task.IsSuccess()) { func(); return DoneTask; } else { return _CallVoidFuncWhenFinish(task, func); } } private static async Task _CallVoidFuncWhenFinish(this Task task, Action func) { await task.ConfigureAwait(false); func(); } public static Task ReturnTaskBoolWhenFinish(this Task task, bool ret) { if (task.IsSuccess()) { if (ret) return DoneTaskTrue; else return DoneTaskFalse; } else { return _ReturnTaskBoolWhenFinish(task, ret); } } public static async Task _ReturnTaskBoolWhenFinish(this Task task, bool ret) { await task.ConfigureAwait(false); return ret; } public static Task CallTaskFuncWhenFinish(this Task task, Func func) { if (task.IsSuccess()) { return func(); } else { return _CallTaskFuncWhenFinish(task, func); } } private static async Task _CallTaskFuncWhenFinish(Task task, Func func) { await task.ConfigureAwait(false); await func().ConfigureAwait(false); } public static Task CallBoolTaskFuncWhenFinish(this Task task, Func> func) { if (task.IsSuccess()) { return func(); } else { return _CallBoolTaskFuncWhenFinish(task, func); } } private static async Task _CallBoolTaskFuncWhenFinish(this Task task, Func> func) { await task.ConfigureAwait(false); return await func().ConfigureAwait(false); } public static Task ContinueBoolTaskFuncWhenFalse(this Task task, Func> func) { if (task.IsSuccess()) { if (task.Result) return DoneTaskTrue; else return func(); } else { return _ContinueBoolTaskFuncWhenFalse(task, func); } } private static async Task _ContinueBoolTaskFuncWhenFalse(Task task, Func> func) { if (await task.ConfigureAwait(false)) return true; else return await func().ConfigureAwait(false); } } }