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