From a814997a4af5a0b311835e26112eceaea7196e29 Mon Sep 17 00:00:00 2001 From: milimoe <110188673+milimoe@users.noreply.github.com> Date: Sat, 26 Aug 2023 13:22:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BATaskAwaiter=E6=B7=BB=E5=8A=A0=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E6=8D=95=E8=8E=B7=E5=92=8COnError=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=20(#49)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Interface/Base/ITaskAwaiter.cs | 2 + Library/Common/Architecture/TaskAwaiter.cs | 24 +++++++++-- Library/Constant/TypeEnum.cs | 2 +- Service/TaskManager.cs | 50 ++++++++++++++++++---- 4 files changed, 64 insertions(+), 14 deletions(-) diff --git a/Interface/Base/ITaskAwaiter.cs b/Interface/Base/ITaskAwaiter.cs index b501909..d35c81e 100644 --- a/Interface/Base/ITaskAwaiter.cs +++ b/Interface/Base/ITaskAwaiter.cs @@ -3,7 +3,9 @@ public interface ITaskAwaiter { public bool IsCompleted { get; } + public Exception Exception { get; } public ITaskAwaiter OnCompleted(Action action); + public ITaskAwaiter OnError(Action action); } } diff --git a/Library/Common/Architecture/TaskAwaiter.cs b/Library/Common/Architecture/TaskAwaiter.cs index d3511fb..5507b0e 100644 --- a/Library/Common/Architecture/TaskAwaiter.cs +++ b/Library/Common/Architecture/TaskAwaiter.cs @@ -11,10 +11,15 @@ namespace Milimoe.FunGame.Core.Library.Common.Architecture /// 任务是否完成 /// public readonly bool IsCompleted => awaiter.IsCompleted; + + /// + /// 捕获到的异常 + /// + public readonly System.Exception Exception => awaiter.Exception; /// /// 内部实现类 - /// + /// 实现参见 /// private ITaskAwaiter awaiter; @@ -28,9 +33,9 @@ namespace Milimoe.FunGame.Core.Library.Common.Architecture } /// - /// 返回TaskAwaiter可以连续的调用方法 - /// 但是意义不大,前一个OnCompleted方法并不会等待下一个方法 - /// 可以理解为并行广播 + /// 返回TaskAwaiter可以连续的调用方法 + /// 但是意义不大,前一个OnCompleted方法并不会等待下一个方法 + /// 可以理解为并行广播 /// /// /// @@ -39,5 +44,16 @@ namespace Milimoe.FunGame.Core.Library.Common.Architecture awaiter = awaiter.OnCompleted(action); return this; } + + /// + /// 在捕获到异常时,将触发Error事件 + /// + /// + /// + public TaskAwaiter OnError(Action action) + { + awaiter = awaiter.OnError(action); + return this; + } } } diff --git a/Library/Constant/TypeEnum.cs b/Library/Constant/TypeEnum.cs index 078d8b0..f86b0e6 100644 --- a/Library/Constant/TypeEnum.cs +++ b/Library/Constant/TypeEnum.cs @@ -91,7 +91,7 @@ namespace Milimoe.FunGame.Core.Library.Constant Main_UpdateRoom, Main_IntoRoom, Main_QuitRoom, - Reg_GetRegVerifyCode, + Reg_GetRegVerifyCode, Login_GetFindPasswordVerifyCode, Login_UpdatePassword, Room_GetRoomSettings, diff --git a/Service/TaskManager.cs b/Service/TaskManager.cs index 3c90616..64fc025 100644 --- a/Service/TaskManager.cs +++ b/Service/TaskManager.cs @@ -24,19 +24,24 @@ namespace Milimoe.FunGame.Core.Service private class TaskAwaiter : ITaskAwaiter { public bool IsCompleted => _IsCompleted; + public Exception Exception => _Exception; private delegate void CompletedEvent(); + private delegate void ErrorEvent(); 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 function) => _ = Worker(function); /// - /// 返回ITaskAwaiter可以进一步调用方法 - /// 但是意义不大,前一个OnCompleted方法并不会等待下一个方法 - /// 可以理解为并行广播 + /// 返回ITaskAwaiter可以进一步调用方法 + /// 但是意义不大,前一个OnCompleted方法并不会等待下一个方法 + /// 可以理解为并行广播 /// /// /// @@ -47,18 +52,45 @@ namespace Milimoe.FunGame.Core.Service return this; } + /// + /// 在捕获到异常时,将触发Error事件 + /// + /// + /// + public ITaskAwaiter OnError(Action action) + { + Error += new ErrorEvent(action); + return this; + } + private async Task Worker(Action action) { - await Task.Run(action); - _IsCompleted = true; - Completed?.Invoke(); + try + { + await Task.Run(action); + _IsCompleted = true; + Completed?.Invoke(); + } + catch (Exception e) + { + _Exception = e; + Error?.Invoke(); + } } private async Task Worker(Func function) { - await function(); - _IsCompleted = true; - Completed?.Invoke(); + try + { + await function(); + _IsCompleted = true; + Completed?.Invoke(); + } + catch (Exception e) + { + _Exception = e; + Error?.Invoke(); + } } } }