##// END OF EJS Templates
Добавлена метка v3.0.14 для набора изменений 95896f882995
Добавлена метка v3.0.14 для набора изменений 95896f882995

File last commit:

r289:95896f882995 v3.0.14 v3
r290:d1de82f869c9 v3
Show More
PromiseAwaiter.cs
61 lines | 1.7 KiB | text/x-csharp | CSharpLexer
/ Implab / src / PromiseAwaiter.cs
cin
Added tests for Implab.ServiceHost.Unity configuration loader.
r289 using System;
using System.Runtime.CompilerServices;
using System.Threading;
using Implab.Parallels;
namespace Implab
{
public struct PromiseAwaiter : INotifyCompletion {
class PromiseEvent : IResolvable {
IDispatcher m_dispatcher;
Action m_handler;
public PromiseEvent(Action handler, IDispatcher dispatcher) {
m_handler = handler;
m_dispatcher = dispatcher;
}
public void Resolve() {
m_dispatcher.Enqueue(m_handler);
}
public void Reject(Exception error) {
m_dispatcher.Enqueue(m_handler);
}
}
readonly IPromise m_promise;
readonly IDispatcher m_dispatcher;
public PromiseAwaiter(IPromise promise, IDispatcher dispatcher) {
m_promise = promise;
m_dispatcher = dispatcher;
}
public PromiseAwaiter(IPromise promise) {
m_promise = promise;
m_dispatcher = GetDispatcher();
}
public void OnCompleted (Action continuation) {
if (m_promise != null)
m_promise.Then(new PromiseEvent(continuation, GetDispatcher()));
}
public void GetResult() {
m_promise.Join();
}
static IDispatcher GetDispatcher() {
if(SynchronizationContext.Current == null)
return ThreadPoolDispatcher.Instance;
return new SyncContextDispatcher(SynchronizationContext.Current);
}
public bool IsCompleted {
get {
return m_promise.IsResolved;
}
}
}
}