mirror of
https://github.com/project-redbud/FunGame-Core.git
synced 2025-04-23 04:29:36 +08:00
添加TaskAwaiter;添加DataRequest枚举 (#43)
This commit is contained in:
parent
98367f89e2
commit
20926ebb09
@ -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
|
||||
{
|
||||
/// <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
|
||||
}
|
||||
|
9
Interface/Base/ITaskAwaiter.cs
Normal file
9
Interface/Base/ITaskAwaiter.cs
Normal file
@ -0,0 +1,9 @@
|
||||
namespace Milimoe.FunGame.Core.Interface.Base
|
||||
{
|
||||
public interface ITaskAwaiter
|
||||
{
|
||||
public bool IsCompleted { get; }
|
||||
|
||||
public ITaskAwaiter OnCompleted(Action action);
|
||||
}
|
||||
}
|
43
Library/Common/Architecture/TaskAwaiter.cs
Normal file
43
Library/Common/Architecture/TaskAwaiter.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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,
|
||||
|
@ -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;
|
||||
|
65
Service/TaskManager.cs
Normal file
65
Service/TaskManager.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user