forked from project-redbud/FunGame-Core
为TaskAwaiter添加异常捕获和OnError事件 (#49)
This commit is contained in:
parent
820111e048
commit
a814997a4a
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -11,10 +11,15 @@ namespace Milimoe.FunGame.Core.Library.Common.Architecture
|
||||
/// 任务是否完成
|
||||
/// </summary>
|
||||
public readonly bool IsCompleted => awaiter.IsCompleted;
|
||||
|
||||
/// <summary>
|
||||
/// 捕获到的异常
|
||||
/// </summary>
|
||||
public readonly System.Exception Exception => awaiter.Exception;
|
||||
|
||||
/// <summary>
|
||||
/// <para>内部实现类</para>
|
||||
/// <see cref="Service.TaskManager.TaskAwaiter"/>
|
||||
/// 实现参见 <see cref="Service.TaskManager.TaskAwaiter"/>
|
||||
/// </summary>
|
||||
private ITaskAwaiter awaiter;
|
||||
|
||||
@ -28,9 +33,9 @@ namespace Milimoe.FunGame.Core.Library.Common.Architecture
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <para>返回TaskAwaiter可以连续的调用方法</para>
|
||||
/// <para>但是意义不大,前一个OnCompleted方法并不会等待下一个方法</para>
|
||||
/// <para>可以理解为并行广播</para>
|
||||
/// 返回TaskAwaiter可以连续的调用方法<para/>
|
||||
/// 但是意义不大,前一个OnCompleted方法并不会等待下一个方法<para/>
|
||||
/// 可以理解为并行广播<para/>
|
||||
/// </summary>
|
||||
/// <param name="action"></param>
|
||||
/// <returns></returns>
|
||||
@ -39,5 +44,16 @@ namespace Milimoe.FunGame.Core.Library.Common.Architecture
|
||||
awaiter = awaiter.OnCompleted(action);
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 在捕获到异常时,将触发Error事件
|
||||
/// </summary>
|
||||
/// <param name="action"></param>
|
||||
/// <returns></returns>
|
||||
public TaskAwaiter OnError(Action action)
|
||||
{
|
||||
awaiter = awaiter.OnError(action);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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<Task> function) => _ = Worker(function);
|
||||
|
||||
/// <summary>
|
||||
/// <para>返回ITaskAwaiter可以进一步调用方法</para>
|
||||
/// <para>但是意义不大,前一个OnCompleted方法并不会等待下一个方法</para>
|
||||
/// <para>可以理解为并行广播</para>
|
||||
/// 返回ITaskAwaiter可以进一步调用方法<para/>
|
||||
/// 但是意义不大,前一个OnCompleted方法并不会等待下一个方法<para/>
|
||||
/// 可以理解为并行广播<para/>
|
||||
/// </summary>
|
||||
/// <param name="action"></param>
|
||||
/// <returns></returns>
|
||||
@ -47,18 +52,45 @@ namespace Milimoe.FunGame.Core.Service
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 在捕获到异常时,将触发Error事件
|
||||
/// </summary>
|
||||
/// <param name="action"></param>
|
||||
/// <returns></returns>
|
||||
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<Task> function)
|
||||
{
|
||||
await function();
|
||||
_IsCompleted = true;
|
||||
Completed?.Invoke();
|
||||
try
|
||||
{
|
||||
await function();
|
||||
_IsCompleted = true;
|
||||
Completed?.Invoke();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_Exception = e;
|
||||
Error?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user