Mercurial > pub > ImplabNet
comparison Implab/PromiseAwaiter.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 { | |
8 public struct PromiseAwaiter : INotifyCompletion { | |
9 class PromiseEvent : IResolvable { | |
10 IDispatcher m_dispatcher; | |
11 | |
12 Action m_handler; | |
13 | |
14 public PromiseEvent(Action handler, IDispatcher dispatcher) { | |
15 m_handler = handler; | |
16 m_dispatcher = dispatcher; | |
17 } | |
18 | |
19 public void Resolve() { | |
20 m_dispatcher.Enqueue(m_handler); | |
21 } | |
22 | |
23 public void Reject(Exception error) { | |
24 m_dispatcher.Enqueue(m_handler); | |
25 } | |
26 } | |
27 | |
28 readonly IPromise m_promise; | |
29 readonly IDispatcher m_dispatcher; | |
30 | |
31 public PromiseAwaiter(IPromise promise, IDispatcher dispatcher) { | |
32 m_promise = promise; | |
33 m_dispatcher = dispatcher; | |
34 } | |
35 | |
36 public PromiseAwaiter(IPromise promise) { | |
37 m_promise = promise; | |
38 m_dispatcher = GetDispatcher(); | |
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 void GetResult() { | |
47 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 } |