Mercurial > pub > ImplabNet
diff Implab.Fx/PromiseHelpers.cs @ 192:f1da3afc3521 release v2.1
Слияние с v2
author | cin |
---|---|
date | Fri, 22 Apr 2016 13:10:34 +0300 |
parents | 2573b562e328 |
children |
line wrap: on
line diff
--- a/Implab.Fx/PromiseHelpers.cs Wed Sep 03 18:34:02 2014 +0400 +++ b/Implab.Fx/PromiseHelpers.cs Fri Apr 22 13:10:34 2016 +0300 @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Windows.Forms; using System.Threading; @@ -20,76 +17,27 @@ /// <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 Promise<T>(); + var directed = new ControlBoundPromise<T>(ctl); - that.Then( - res => - { - if (ctl.InvokeRequired) - ctl.Invoke(new Action<T>(directed.Resolve), res); - else - directed.Resolve(res); - }, - err => - { - if (ctl.InvokeRequired) - ctl.Invoke(new Action<Exception>(directed.Reject), err); - else - directed.Reject(err); - } + directed.On(that.Cancel, PromiseEventType.Cancelled); + + that.On( + directed.Resolve, + 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 d; - } } }