From 20926ebb09761e59dac2ca7a8dec78db79536d05 Mon Sep 17 00:00:00 2001 From: milimoe <110188673+milimoe@users.noreply.github.com> Date: Thu, 20 Jul 2023 09:33:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0TaskAwaiter=EF=BC=9B=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0DataRequest=E6=9E=9A=E4=B8=BE=20(#43)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Api/Utility/General.cs | 20 +++++++ Interface/Base/ITaskAwaiter.cs | 9 +++ Library/Common/Architecture/TaskAwaiter.cs | 43 ++++++++++++++ Library/Constant/TypeEnum.cs | 2 + Service/JsonManager.cs | 3 +- Service/TaskManager.cs | 65 ++++++++++++++++++++++ 6 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 Interface/Base/ITaskAwaiter.cs create mode 100644 Library/Common/Architecture/TaskAwaiter.cs create mode 100644 Service/TaskManager.cs diff --git a/Api/Utility/General.cs b/Api/Utility/General.cs index 5beeb1c..0de6b12 100644 --- a/Api/Utility/General.cs +++ b/Api/Utility/General.cs @@ -2,6 +2,7 @@ using System.Net.NetworkInformation; using System.Security.Cryptography; using System.Text.RegularExpressions; +using Milimoe.FunGame.Core.Library.Common.Architecture; using Milimoe.FunGame.Core.Library.Constant; // 通用工具类,客户端和服务器端都可以直接调用的工具方法都可以写在这里 @@ -382,4 +383,23 @@ namespace Milimoe.FunGame.Core.Api.Utility } #endregion + + #region 多线程服务 + + public class TaskUtility + { + /// + /// 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步 + /// + /// + public static TaskAwaiter StartAndAwaitTask(Action action) => new(Service.TaskManager.StartAndAwaitTask(action)); + + /// + /// 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步 + /// + /// + public static TaskAwaiter StartAndAwaitTask(Func task) => new(Service.TaskManager.StartAndAwaitTask(task)); + } + + #endregion } diff --git a/Interface/Base/ITaskAwaiter.cs b/Interface/Base/ITaskAwaiter.cs new file mode 100644 index 0000000..b501909 --- /dev/null +++ b/Interface/Base/ITaskAwaiter.cs @@ -0,0 +1,9 @@ +namespace Milimoe.FunGame.Core.Interface.Base +{ + public interface ITaskAwaiter + { + public bool IsCompleted { get; } + + public ITaskAwaiter OnCompleted(Action action); + } +} diff --git a/Library/Common/Architecture/TaskAwaiter.cs b/Library/Common/Architecture/TaskAwaiter.cs new file mode 100644 index 0000000..d3511fb --- /dev/null +++ b/Library/Common/Architecture/TaskAwaiter.cs @@ -0,0 +1,43 @@ +using Milimoe.FunGame.Core.Interface.Base; + +namespace Milimoe.FunGame.Core.Library.Common.Architecture +{ + /// + /// 任务的等待器,可以设置在任务完成后需要的操作 + /// + public struct TaskAwaiter + { + /// + /// 任务是否完成 + /// + public readonly bool IsCompleted => awaiter.IsCompleted; + + /// + /// 内部实现类 + /// + /// + private ITaskAwaiter awaiter; + + /// + /// 构造一个等待器 + /// + /// + internal TaskAwaiter(ITaskAwaiter awaiter) + { + this.awaiter = awaiter; + } + + /// + /// 返回TaskAwaiter可以连续的调用方法 + /// 但是意义不大,前一个OnCompleted方法并不会等待下一个方法 + /// 可以理解为并行广播 + /// + /// + /// + public TaskAwaiter OnCompleted(Action action) + { + awaiter = awaiter.OnCompleted(action); + return this; + } + } +} diff --git a/Library/Constant/TypeEnum.cs b/Library/Constant/TypeEnum.cs index 8a0f9c1..078d8b0 100644 --- a/Library/Constant/TypeEnum.cs +++ b/Library/Constant/TypeEnum.cs @@ -89,6 +89,8 @@ namespace Milimoe.FunGame.Core.Library.Constant Main_GetNotice, Main_CreateRoom, Main_UpdateRoom, + Main_IntoRoom, + Main_QuitRoom, Reg_GetRegVerifyCode, Login_GetFindPasswordVerifyCode, Login_UpdatePassword, diff --git a/Service/JsonManager.cs b/Service/JsonManager.cs index c8c896f..83237d6 100644 --- a/Service/JsonManager.cs +++ b/Service/JsonManager.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections; +using System.Collections; using System.Text.Json; using System.Text.Json.Serialization; using Milimoe.FunGame.Core.Library.Common.JsonConverter; diff --git a/Service/TaskManager.cs b/Service/TaskManager.cs new file mode 100644 index 0000000..3c90616 --- /dev/null +++ b/Service/TaskManager.cs @@ -0,0 +1,65 @@ +using Milimoe.FunGame.Core.Interface.Base; + +namespace Milimoe.FunGame.Core.Service +{ + internal class TaskManager + { + /// + /// 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步 + /// + /// + /// + internal static ITaskAwaiter StartAndAwaitTask(Action action) => new TaskAwaiter(action); + + /// + /// 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步 + /// + /// + /// + internal static ITaskAwaiter StartAndAwaitTask(Func function) => new TaskAwaiter(function); + + /// + /// 内部实现类 + /// + 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 function) => _ = Worker(function); + + /// + /// 返回ITaskAwaiter可以进一步调用方法 + /// 但是意义不大,前一个OnCompleted方法并不会等待下一个方法 + /// 可以理解为并行广播 + /// + /// + /// + 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 function) + { + await function(); + _IsCompleted = true; + Completed?.Invoke(); + } + } + } +}