Mercurial > pub > ImplabNet
diff Implab.Fx/PromiseHelpers.cs @ 76:c761fc982e1d v2
Refactoring of the IPromise<T> interface
Added tests
author | cin |
---|---|
date | Wed, 10 Sep 2014 17:53:05 +0400 |
parents | d67b95eddaf4 |
children | b4c4d65b7def |
line wrap: on
line diff
--- a/Implab.Fx/PromiseHelpers.cs Wed Sep 10 11:17:37 2014 +0400 +++ b/Implab.Fx/PromiseHelpers.cs Wed Sep 10 17:53:05 2014 +0400 @@ -17,71 +17,25 @@ /// <example> /// client /// .Get("description.txt") // returns a promise - /// .DirectToControl(m_ctl) // handle the promise in the thread of the control + /// .DispatchToControl(m_ctl) // handle the promise in the thread of the control /// .Then( /// description => m_ctl.Text = description // now it's safe /// ) /// </example> - public static Promise<T> DispatchToControl<T>(this Promise<T> that, Control ctl) + public static IPromise<T> DispatchToControl<T>(this IPromise<T> that, Control ctl) { - if (that == null) - throw new ArgumentNullException("that"); - if (ctl == null) - throw new ArgumentNullException("ctl"); + Safe.ArgumentNotNull(that, "that"); + Safe.ArgumentNotNull(ctl, "ctl"); var directed = new ControlBoundPromise<T>(ctl,that,true); - that.Then( + that.Last( directed.Resolve, - err => - { - directed.Reject(err); - return default(T); - } + directed.Reject, + directed.Cancel ); return directed; } - - /// <summary> - /// Направляет обработку обещания в текущий поток, если у него существует контекст синхронизации. - /// </summary> - /// <typeparam name="T">Тип результата обещания.</typeparam> - /// <param name="that">Обещание которое нужно обработать в текущем потоке.</param> - /// <returns>Перенаправленное обещание.</returns> - public static Promise<T> DispatchToCurrentThread<T>(this Promise<T> that) - { - var sync = SynchronizationContext.Current; - if (sync == null) - throw new InvalidOperationException("The current thread doesn't have a syncronization context"); - return DispatchToSyncContext(that, sync); - } - - /// <summary> - /// Направляет обработку обещания в указанный контекст синхронизации. - /// </summary> - /// <typeparam name="T">Тип результата обещания.</typeparam> - /// <param name="that">Обещание, которое требуется обработать в указанном контексте синхронизации.</param> - /// <param name="sync">Контекст синхронизации в который будет направлено обещание.</param> - /// <returns>Новое обещание, которое будет обрабатываться в указанном контексте.</returns> - public static Promise<T> DispatchToSyncContext<T>(this Promise<T> that, SynchronizationContext sync) - { - if (that == null) - throw new ArgumentNullException("that"); - if (sync == null) - throw new ArgumentNullException("sync"); - - var d = new Promise<T>(); - - that.Then( - res => sync.Post(state => d.Resolve(res), null), - err => { - sync.Post(state => d.Reject(err), null); - return default(T); - } - ); - - return d; - } } }