Mercurial > pub > ImplabNet
comparison Implab/PromiseAwaiter`1.cs @ 248:5cb4826c2c2a v3
Added awaiters to promises
Added static methods to Promise Resolve, Reject, All.
Updated promise helpers
author | cin |
---|---|
date | Tue, 30 Jan 2018 01:37:17 +0300 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
247:fb70574741a1 | 248:5cb4826c2c2a |
---|---|
1 using System; | |
2 using System.Runtime.CompilerServices; | |
3 using System.Threading; | |
4 using Implab.Parallels; | |
5 | |
6 namespace Implab { | |
7 public struct PromiseAwaiter<T> : INotifyCompletion { | |
8 class PromiseEvent : IResolvable<T> { | |
9 IDispatcher m_dispatcher; | |
10 | |
11 Action m_handler; | |
12 | |
13 public PromiseEvent(Action handler, IDispatcher dispatcher) { | |
14 m_handler = handler; | |
15 m_dispatcher = dispatcher; | |
16 } | |
17 | |
18 public void Resolve(T result) { | |
19 m_dispatcher.Enqueue(m_handler); | |
20 } | |
21 | |
22 public void Reject(Exception error) { | |
23 m_dispatcher.Enqueue(m_handler); | |
24 } | |
25 } | |
26 | |
27 readonly IPromise<T> m_promise; | |
28 | |
29 readonly IDispatcher m_dispatcher; | |
30 | |
31 public PromiseAwaiter(IPromise<T> promise) { | |
32 m_promise = promise; | |
33 m_dispatcher = GetDispatcher(); | |
34 } | |
35 | |
36 public PromiseAwaiter(IPromise<T> promise, IDispatcher dispatcher) { | |
37 m_promise = promise; | |
38 m_dispatcher = dispatcher; | |
39 } | |
40 | |
41 public void OnCompleted(Action continuation) { | |
42 if (m_promise != null) | |
43 m_promise.Then(new PromiseEvent(continuation, GetDispatcher())); | |
44 } | |
45 | |
46 public T GetResult() { | |
47 return m_promise.Join(); | |
48 } | |
49 | |
50 static IDispatcher GetDispatcher() { | |
51 if (SynchronizationContext.Current == null) | |
52 return ThreadPoolDispatcher.Instance; | |
53 return new SyncContextDispatcher(SynchronizationContext.Current); | |
54 } | |
55 | |
56 public bool IsCompleted { | |
57 get { | |
58 return m_promise.IsResolved; | |
59 } | |
60 } | |
61 } | |
62 } |