using Milimoe.FunGame.Core.Interface.Base; namespace Milimoe.FunGame.Core.Service { internal class TaskManager { /// /// 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步 /// /// /// internal static ITaskAwaiter StartAndAwaitTask(Action action) => new TaskAwaiter(action); /// /// 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步 /// /// /// internal static ITaskAwaiter StartAndAwaitTask(Func function) => new TaskAwaiter(function); /// /// 内部实现类 /// private class TaskAwaiter : ITaskAwaiter { public bool IsCompleted => _IsCompleted; public Exception Exception => _Exception; private delegate void CompletedEvent(); private delegate void ErrorEvent(Exception e); private event CompletedEvent? Completed; private event ErrorEvent? Error; private bool _IsCompleted = false; private Exception _Exception = new(); internal TaskAwaiter(Action action) => _ = Worker(action); internal TaskAwaiter(Func function) => _ = Worker(function); /// /// 返回ITaskAwaiter可以进一步调用方法 /// 但是意义不大,前一个OnCompleted方法并不会等待下一个方法 /// 可以理解为并行广播 /// /// /// public ITaskAwaiter OnCompleted(Action action) { if (IsCompleted) action(); else Completed += new CompletedEvent(action); return this; } /// /// 在捕获到异常时,将触发Error事件 /// /// /// public ITaskAwaiter OnError(Action action) { Error += new ErrorEvent(action); return this; } private async Task Worker(Action action) { try { await Task.Run(action); _IsCompleted = true; Completed?.Invoke(); } catch (Exception e) { _Exception = e; Error?.Invoke(e); } } private async Task Worker(Func function) { try { await function(); _IsCompleted = true; Completed?.Invoke(); } catch (Exception e) { _Exception = e; Error?.Invoke(e); } } } } }