rabidus-test/Assets/Plugins/QFSW/Quantum Console/Source/Scripts/Actions/Async.cs

78 lines
2.1 KiB
C#

using System;
using System.Threading.Tasks;
namespace QFSW.QC.Actions
{
/// <summary>
/// Converts an async Task into an action.
/// </summary>
public class Async : ICommandAction
{
private readonly Task _task;
public bool IsFinished => _task.IsCompleted ||
_task.IsCanceled ||
_task.IsFaulted;
public bool StartsIdle => false;
/// <param name="task">The async Task to convert.</param>
public Async(Task task)
{
_task = task;
}
public void Start(ActionContext context) { }
public void Finalize(ActionContext context)
{
if (_task.IsFaulted)
{
throw _task.Exception.InnerException;
}
if (_task.IsCanceled)
{
throw new TaskCanceledException();
}
}
}
/// <summary>
/// Converts an async Task into an action.
/// </summary>
/// <typeparam name="T">The return type of the Task to convert.</typeparam>
public class Async<T> : ICommandAction
{
private readonly Task<T> _task;
private readonly Action<T> _onResult;
public bool IsFinished => _task.IsCompleted ||
_task.IsCanceled ||
_task.IsFaulted;
public bool StartsIdle => false;
/// <param name="task">The async Task to convert.</param>
/// <param name="onResult">The action to invoke when the Task completes.</param>
public Async(Task<T> task, Action<T> onResult)
{
_task = task;
_onResult = onResult;
}
public void Start(ActionContext context) { }
public void Finalize(ActionContext context)
{
if (_task.IsFaulted)
{
throw _task.Exception.InnerException;
}
if (_task.IsCanceled)
{
throw new TaskCanceledException();
}
_onResult(_task.Result);
}
}
}