コード例 #1
0
ファイル: RdTaskEx.cs プロジェクト: vorotynsky/rd
        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);
        }
コード例 #2
0
ファイル: ProxyGeneratorUtil.cs プロジェクト: JetBrains/rd
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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));
        }
コード例 #5
0
ファイル: RdTaskEx.cs プロジェクト: vorotynsky/rd
 public static bool Wait <T>(this IRdTask <T> task, TimeSpan timeout) => SpinWaitEx.SpinUntil(Lifetime.Eternal, timeout, () => task.Result.HasValue());
コード例 #6
0
ファイル: RdTaskEx.cs プロジェクト: vorotynsky/rd
 [PublicAPI] public static bool IsFaulted <T>(this IRdTask <T> task) => task.Result.HasValue() && task.Result.Value.Status == RdTaskStatus.Faulted;
コード例 #7
0
ファイル: RdTaskEx.cs プロジェクト: LongJohnCoder/rd
 public static bool IsCanceled <T>(this IRdTask <T> task) => task.Result.HasValue() && task.Result.Value.Status == RdTaskStatus.Canceled;
コード例 #8
0
ファイル: RdTaskEx.cs プロジェクト: LongJohnCoder/rd
 public static bool IsSucceed <T>(this IRdTask <T> task) => task.Result.HasValue() && task.Result.Value.Status == RdTaskStatus.Success;