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();
+ }
+ }
+ }
+}