comparison 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
comparison
equal deleted inserted replaced
75:4439140706d0 76:c761fc982e1d
15 /// <returns>Новое обещание, обработчики которого будут выполнены в потоке элемента управления.</returns> 15 /// <returns>Новое обещание, обработчики которого будут выполнены в потоке элемента управления.</returns>
16 /// <exception cref="ArgumentNullException">Параметр не может быть <c>null</c>.</exception> 16 /// <exception cref="ArgumentNullException">Параметр не может быть <c>null</c>.</exception>
17 /// <example> 17 /// <example>
18 /// client 18 /// client
19 /// .Get("description.txt") // returns a promise 19 /// .Get("description.txt") // returns a promise
20 /// .DirectToControl(m_ctl) // handle the promise in the thread of the control 20 /// .DispatchToControl(m_ctl) // handle the promise in the thread of the control
21 /// .Then( 21 /// .Then(
22 /// description => m_ctl.Text = description // now it's safe 22 /// description => m_ctl.Text = description // now it's safe
23 /// ) 23 /// )
24 /// </example> 24 /// </example>
25 public static Promise<T> DispatchToControl<T>(this Promise<T> that, Control ctl) 25 public static IPromise<T> DispatchToControl<T>(this IPromise<T> that, Control ctl)
26 { 26 {
27 if (that == null) 27 Safe.ArgumentNotNull(that, "that");
28 throw new ArgumentNullException("that"); 28 Safe.ArgumentNotNull(ctl, "ctl");
29 if (ctl == null)
30 throw new ArgumentNullException("ctl");
31 29
32 var directed = new ControlBoundPromise<T>(ctl,that,true); 30 var directed = new ControlBoundPromise<T>(ctl,that,true);
33 31
34 that.Then( 32 that.Last(
35 directed.Resolve, 33 directed.Resolve,
36 err => 34 directed.Reject,
37 { 35 directed.Cancel
38 directed.Reject(err);
39 return default(T);
40 }
41 ); 36 );
42 37
43 return directed; 38 return directed;
44 } 39 }
45
46 /// <summary>
47 /// Направляет обработку обещания в текущий поток, если у него существует контекст синхронизации.
48 /// </summary>
49 /// <typeparam name="T">Тип результата обещания.</typeparam>
50 /// <param name="that">Обещание которое нужно обработать в текущем потоке.</param>
51 /// <returns>Перенаправленное обещание.</returns>
52 public static Promise<T> DispatchToCurrentThread<T>(this Promise<T> that)
53 {
54 var sync = SynchronizationContext.Current;
55 if (sync == null)
56 throw new InvalidOperationException("The current thread doesn't have a syncronization context");
57 return DispatchToSyncContext(that, sync);
58 }
59
60 /// <summary>
61 /// Направляет обработку обещания в указанный контекст синхронизации.
62 /// </summary>
63 /// <typeparam name="T">Тип результата обещания.</typeparam>
64 /// <param name="that">Обещание, которое требуется обработать в указанном контексте синхронизации.</param>
65 /// <param name="sync">Контекст синхронизации в который будет направлено обещание.</param>
66 /// <returns>Новое обещание, которое будет обрабатываться в указанном контексте.</returns>
67 public static Promise<T> DispatchToSyncContext<T>(this Promise<T> that, SynchronizationContext sync)
68 {
69 if (that == null)
70 throw new ArgumentNullException("that");
71 if (sync == null)
72 throw new ArgumentNullException("sync");
73
74 var d = new Promise<T>();
75
76 that.Then(
77 res => sync.Post(state => d.Resolve(res), null),
78 err => {
79 sync.Post(state => d.Reject(err), null);
80 return default(T);
81 }
82 );
83
84 return d;
85 }
86 } 40 }
87 } 41 }