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;
-        }
     }
 }