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;
}
}
}