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; private delegate void CompletedEvent(); private event CompletedEvent? Completed; private bool _IsCompleted = false; 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; } private async Task Worker(Action action) { await Task.Run(action); _IsCompleted = true; Completed?.Invoke(); } private async Task Worker(Func function) { await function(); _IsCompleted = true; Completed?.Invoke(); } } } }