添加TaskAwaiter;添加DataRequest枚举 (#43)

This commit is contained in:
milimoe 2023-07-20 09:33:24 +08:00 committed by GitHub
parent 98367f89e2
commit 20926ebb09
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 140 additions and 2 deletions

View File

@ -2,6 +2,7 @@
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Milimoe.FunGame.Core.Library.Common.Architecture;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
// 通用工具类,客户端和服务器端都可以直接调用的工具方法都可以写在这里 // 通用工具类,客户端和服务器端都可以直接调用的工具方法都可以写在这里
@ -382,4 +383,23 @@ namespace Milimoe.FunGame.Core.Api.Utility
} }
#endregion #endregion
#region 线
public class TaskUtility
{
/// <summary>
/// 开启一个任务调用返回对象的OnCompleted()方法可以执行后续操作,支持异步
/// </summary>
/// <param name="action"></param>
public static TaskAwaiter StartAndAwaitTask(Action action) => new(Service.TaskManager.StartAndAwaitTask(action));
/// <summary>
/// 开启一个任务调用返回对象的OnCompleted()方法可以执行后续操作,支持异步
/// </summary>
/// <param name="task"></param>
public static TaskAwaiter StartAndAwaitTask(Func<Task> task) => new(Service.TaskManager.StartAndAwaitTask(task));
}
#endregion
} }

View File

@ -0,0 +1,9 @@
namespace Milimoe.FunGame.Core.Interface.Base
{
public interface ITaskAwaiter
{
public bool IsCompleted { get; }
public ITaskAwaiter OnCompleted(Action action);
}
}

View File

@ -0,0 +1,43 @@
using Milimoe.FunGame.Core.Interface.Base;
namespace Milimoe.FunGame.Core.Library.Common.Architecture
{
/// <summary>
/// 任务的等待器,可以设置在任务完成后需要的操作
/// </summary>
public struct TaskAwaiter
{
/// <summary>
/// 任务是否完成
/// </summary>
public readonly bool IsCompleted => awaiter.IsCompleted;
/// <summary>
/// <para>内部实现类</para>
/// <see cref="Service.TaskManager.TaskAwaiter"/>
/// </summary>
private ITaskAwaiter awaiter;
/// <summary>
/// 构造一个等待器
/// </summary>
/// <param name="awaiter"></param>
internal TaskAwaiter(ITaskAwaiter awaiter)
{
this.awaiter = awaiter;
}
/// <summary>
/// <para>返回TaskAwaiter可以连续的调用方法</para>
/// <para>但是意义不大前一个OnCompleted方法并不会等待下一个方法</para>
/// <para>可以理解为并行广播</para>
/// </summary>
/// <param name="action"></param>
/// <returns></returns>
public TaskAwaiter OnCompleted(Action action)
{
awaiter = awaiter.OnCompleted(action);
return this;
}
}
}

View File

@ -89,6 +89,8 @@ namespace Milimoe.FunGame.Core.Library.Constant
Main_GetNotice, Main_GetNotice,
Main_CreateRoom, Main_CreateRoom,
Main_UpdateRoom, Main_UpdateRoom,
Main_IntoRoom,
Main_QuitRoom,
Reg_GetRegVerifyCode, Reg_GetRegVerifyCode,
Login_GetFindPasswordVerifyCode, Login_GetFindPasswordVerifyCode,
Login_UpdatePassword, Login_UpdatePassword,

View File

@ -1,5 +1,4 @@
using System; using System.Collections;
using System.Collections;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Milimoe.FunGame.Core.Library.Common.JsonConverter; using Milimoe.FunGame.Core.Library.Common.JsonConverter;

65
Service/TaskManager.cs Normal file
View File

@ -0,0 +1,65 @@
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 StartAndAwaitTask(Action action) => new TaskAwaiter(action);
/// <summary>
/// 开启一个任务调用返回对象的OnCompleted()方法可以执行后续操作,支持异步
/// </summary>
/// <param name="function"></param>
/// <returns></returns>
internal static ITaskAwaiter StartAndAwaitTask(Func<Task> function) => new TaskAwaiter(function);
/// <summary>
/// 内部实现类
/// </summary>
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<Task> function) => _ = Worker(function);
/// <summary>
/// <para>返回ITaskAwaiter可以进一步调用方法</para>
/// <para>但是意义不大前一个OnCompleted方法并不会等待下一个方法</para>
/// <para>可以理解为并行广播</para>
/// </summary>
/// <param name="action"></param>
/// <returns></returns>
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<Task> function)
{
await function();
_IsCompleted = true;
Completed?.Invoke();
}
}
}
}