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