using Milimoe.FunGame.Core.Interface.Base;
namespace Milimoe.FunGame.Core.Service
{
internal class TaskManager
{
///
/// 开启一个任务:调用返回对象的 OnCompleted() 方法可以执行后续操作,支持异步
///
///
///
internal static ITaskAwaiter NewTask(Action action) => new TaskAwaiter(action);
///
/// 开启一个任务:调用返回对象的 OnCompleted() 方法可以执行后续操作,支持异步
///
///
///
internal static ITaskAwaiter NewTask(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 可以进一步等待并执行方法
/// 注意事项:async () 委托的后续 OnCompleted 方法将不会进一步等待,而是直接执行,因为它是异步的
///
///
///
public ITaskAwaiter OnCompleted(Action action)
{
Completed += () =>
{
action();
};
return this;
}
///
/// 在捕获到异常时,将触发 Error 事件
///
///
///
public ITaskAwaiter OnError(Action action)
{
Error += new ErrorEvent(action);
return this;
}
private void Worker(Action action)
{
Task.Run(async () =>
{
try
{
await Task.Run(action);
_IsCompleted = true;
Completed?.Invoke();
}
catch (Exception e)
{
_Exception = e;
Error?.Invoke(e);
}
});
}
private void Worker(Func function)
{
Task.Run(async () =>
{
try
{
await function();
_IsCompleted = true;
Completed?.Invoke();
}
catch (Exception e)
{
_Exception = e;
Error?.Invoke(e);
}
});
}
}
}
}