mirror of
https://github.com/project-redbud/FunGame-Core.git
synced 2025-04-22 03:59:35 +08:00

* 重做 WebSocket 监听;为服务器统一了多种数据连接访问时的处理;统一编码为 UTF-8 * ModelManager已更名并移动到工具命名空间中 * 完成 WebSocket 消息处理系统 * 添加Socket异步接收数据流;修复TaskUtility阻塞的问题;优化心跳、房间、模组 * 添加枚举 * 删除多余字符 * 添加监听器的名称 * 修改了命名
104 lines
3.4 KiB
C#
104 lines
3.4 KiB
C#
using Milimoe.FunGame.Core.Interface.Base;
|
||
|
||
namespace Milimoe.FunGame.Core.Service
|
||
{
|
||
internal class TaskManager
|
||
{
|
||
/// <summary>
|
||
/// 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步
|
||
/// </summary>
|
||
/// <param name="action"></param>
|
||
/// <returns></returns>
|
||
internal static ITaskAwaiter NewTask(Action action) => new TaskAwaiter(action);
|
||
|
||
/// <summary>
|
||
/// 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步
|
||
/// </summary>
|
||
/// <param name="function"></param>
|
||
/// <returns></returns>
|
||
internal static ITaskAwaiter NewTask(Func<Task> function) => new TaskAwaiter(function);
|
||
|
||
/// <summary>
|
||
/// 内部实现类
|
||
/// </summary>
|
||
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<Task> function) => Worker(function);
|
||
|
||
/// <summary>
|
||
/// 返回ITaskAwaiter可以进一步调用方法<para/>
|
||
/// 但是意义不大,前一个OnCompleted方法并不会等待下一个方法<para/>
|
||
/// 可以理解为并行广播<para/>
|
||
/// </summary>
|
||
/// <param name="action"></param>
|
||
/// <returns></returns>
|
||
public ITaskAwaiter OnCompleted(Action action)
|
||
{
|
||
if (IsCompleted) action();
|
||
else Completed += new CompletedEvent(action);
|
||
return this;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 在捕获到异常时,将触发Error事件
|
||
/// </summary>
|
||
/// <param name="action"></param>
|
||
/// <returns></returns>
|
||
public ITaskAwaiter OnError(Action<Exception> 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<Task> function)
|
||
{
|
||
Task.Run(async () =>
|
||
{
|
||
try
|
||
{
|
||
await function();
|
||
_IsCompleted = true;
|
||
Completed?.Invoke();
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
_Exception = e;
|
||
Error?.Invoke(e);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
}
|
||
}
|