using Milimoe.FunGame.Core.Interface.Base; namespace Milimoe.FunGame.Core.Library.Common.Architecture { /// /// 任务的等待器,可以设置在任务完成后需要的操作 /// public struct TaskAwaiter { /// /// 任务是否完成 /// public readonly bool IsCompleted => awaiter.IsCompleted; /// /// 捕获到的异常 /// public readonly System.Exception Exception => awaiter.Exception; /// /// 内部实现类 /// 实现参见 /// private ITaskAwaiter awaiter; /// /// 构造一个等待器 /// /// internal TaskAwaiter(ITaskAwaiter awaiter) { this.awaiter = awaiter; } /// /// 返回 TaskAwaiter 可以进一步等待并执行方法 /// 注意事项:async () 委托的后续 OnCompleted 方法将不会进一步等待,而是直接执行,因为它是异步的 /// /// 这意味着你不能这样操作: /// /// TaskUtility.NewTask(() => /// { /// Console.WriteLine(0); /// }).OnCompleted(async () => /// { /// await Task.Delay(3000); /// Console.WriteLine(1); /// }).OnCompleted(() => /// { /// Console.WriteLine(2); /// }); /// /// 上述代码将导致:任务输出 0 之后,2 不会等待 1 的完成,因此会直接输出 2,再输出 1. /// /// /// /// public TaskAwaiter OnCompleted(Action action) { awaiter = awaiter.OnCompleted(action); return this; } /// /// 在捕获到异常时,将触发Error事件 /// /// /// public TaskAwaiter OnError(Action action) { awaiter = awaiter.OnError(action); return this; } } }