public static Task <T> AsTask <T>([NotNull] this IRdTask <T> task) { if (task == null) { throw new ArgumentNullException(nameof(task)); } var tcs = new TaskCompletionSource <T>(); task.Result.AdviseOnce(Lifetime.Eternal, result => { switch (result.Status) { case RdTaskStatus.Success: tcs.SetResult(result.Result); break; case RdTaskStatus.Canceled: tcs.SetCanceled(); break; case RdTaskStatus.Faulted: tcs.SetException(result.Error); break; default: throw new ArgumentOutOfRangeException(result.Status.ToString()); } }); return(tcs.Task); }
public static Task <T> ToTask <T>(IRdTask <T> task) { var tcs = new TaskCompletionSource <T>(); task.Result.Advise(Lifetime.Eternal, r => { switch (r.Status) { case RdTaskStatus.Success: tcs.SetResult(r.Result); break; case RdTaskStatus.Canceled: tcs.SetCanceled(); break; case RdTaskStatus.Faulted: tcs.SetException(r.Error); break; default: throw new ArgumentOutOfRangeException(); } }); return(tcs.Task); }
public static RdTask <T> ToRdTask <T>(this IRdTask <T> task, Lifetime lifetime) { if (task is RdTask <T> rdTask) { return(rdTask); } var newRdTask = new RdTask <T>(); task.Result.Advise(lifetime, result => { switch (result.Status) { case RdTaskStatus.Success: newRdTask.Set(result.Result); break; case RdTaskStatus.Canceled: newRdTask.SetCancelled(); break; case RdTaskStatus.Faulted: newRdTask.Set(result.Error); break; } }); return(newRdTask); }
public static bool Wait <T>(this IRdTask <T> task, TimeSpan timeout) { var evt = new ManualResetEvent(false); task.Result.Advise(Lifetime.Eternal, _ => evt.Set()); return(evt.WaitOne((int)timeout.TotalMilliseconds)); }
public static bool Wait <T>(this IRdTask <T> task, TimeSpan timeout) => SpinWaitEx.SpinUntil(Lifetime.Eternal, timeout, () => task.Result.HasValue());
[PublicAPI] public static bool IsFaulted <T>(this IRdTask <T> task) => task.Result.HasValue() && task.Result.Value.Status == RdTaskStatus.Faulted;
public static bool IsCanceled <T>(this IRdTask <T> task) => task.Result.HasValue() && task.Result.Value.Status == RdTaskStatus.Canceled;
public static bool IsSucceed <T>(this IRdTask <T> task) => task.Result.HasValue() && task.Result.Value.Status == RdTaskStatus.Success;