Auto status change to "Under Review"
@@ -0,0 +1,18 | |||||
|
1 | using System.Threading; | |||
|
2 | using System; | |||
|
3 | ||||
|
4 | namespace Implab { | |||
|
5 | public class SyncContextPromise<T> : Promise<T> { | |||
|
6 | readonly SynchronizationContext m_context; | |||
|
7 | ||||
|
8 | public SyncContextPromise(SynchronizationContext context) { | |||
|
9 | Safe.ArgumentNotNull(context, "context"); | |||
|
10 | m_context = context; | |||
|
11 | } | |||
|
12 | ||||
|
13 | protected override void SignalHandler(HandlerDescriptor handler, int signal) { | |||
|
14 | m_context.Post(x => base.SignalHandler(handler, signal), null); | |||
|
15 | } | |||
|
16 | } | |||
|
17 | } | |||
|
18 |
@@ -13,6 +13,8 namespace Implab.Fx { | |||||
13 | public class StaApartment : RunnableComponent { |
|
13 | public class StaApartment : RunnableComponent { | |
14 | readonly Thread m_worker; |
|
14 | readonly Thread m_worker; | |
15 | SynchronizationContext m_syncContext; |
|
15 | SynchronizationContext m_syncContext; | |
|
16 | SyncContextPromise m_enterPromise; | |||
|
17 | ||||
16 | readonly Promise m_threadStarted; |
|
18 | readonly Promise m_threadStarted; | |
17 | readonly Promise m_threadTerminated; |
|
19 | readonly Promise m_threadTerminated; | |
18 |
|
20 | |||
@@ -34,6 +36,19 namespace Implab.Fx { | |||||
34 | } |
|
36 | } | |
35 | } |
|
37 | } | |
36 |
|
38 | |||
|
39 | /// <summary> | |||
|
40 | /// Returns the promise which will dispatch all handlers inside the apartment using it's <see cref="SynchronizationContext"/> | |||
|
41 | /// </summary> | |||
|
42 | /// <remarks> | |||
|
43 | /// Current implementation is optimized and will lost aync operation stack | |||
|
44 | /// </remarks> | |||
|
45 | /// <returns>The promise</returns> | |||
|
46 | public IPromise Enter() { | |||
|
47 | if (m_enterPromise == null) | |||
|
48 | throw new InvalidOperationException(); | |||
|
49 | return m_enterPromise; | |||
|
50 | } | |||
|
51 | ||||
37 | public IPromise Invoke(Action<ICancellationToken> action) { |
|
52 | public IPromise Invoke(Action<ICancellationToken> action) { | |
38 | Safe.ArgumentNotNull(action, "action"); |
|
53 | Safe.ArgumentNotNull(action, "action"); | |
39 |
|
54 | |||
@@ -156,8 +171,9 namespace Implab.Fx { | |||||
156 | void WorkerEntry() { |
|
171 | void WorkerEntry() { | |
157 | m_syncContext = new WindowsFormsSynchronizationContext(); |
|
172 | m_syncContext = new WindowsFormsSynchronizationContext(); | |
158 | SynchronizationContext.SetSynchronizationContext(m_syncContext); |
|
173 | SynchronizationContext.SetSynchronizationContext(m_syncContext); | |
159 |
|
174 | m_enterPromise = new SyncContextPromise(m_syncContext); | ||
160 | m_threadStarted.Resolve(); |
|
175 | m_threadStarted.Resolve(); | |
|
176 | m_enterPromise.Resolve(); | |||
161 |
|
177 | |||
162 | Application.OleRequired(); |
|
178 | Application.OleRequired(); | |
163 | Application.Run(); |
|
179 | Application.Run(); |
@@ -99,9 +99,10 | |||||
99 | <Compile Include="Properties\AssemblyInfo.cs" /> |
|
99 | <Compile Include="Properties\AssemblyInfo.cs" /> | |
100 | <Compile Include="Parallels\AsyncPool.cs" /> |
|
100 | <Compile Include="Parallels\AsyncPool.cs" /> | |
101 | <Compile Include="Safe.cs" /> |
|
101 | <Compile Include="Safe.cs" /> | |
|
102 | <Compile Include="SyncContextPromise.cs" /> | |||
102 | <Compile Include="ValueEventArgs.cs" /> |
|
103 | <Compile Include="ValueEventArgs.cs" /> | |
103 | <Compile Include="PromiseExtensions.cs" /> |
|
104 | <Compile Include="PromiseExtensions.cs" /> | |
104 | <Compile Include="SyncContextPromise.cs" /> |
|
105 | <Compile Include="SyncContextPromiseT.cs" /> | |
105 | <Compile Include="Diagnostics\OperationContext.cs" /> |
|
106 | <Compile Include="Diagnostics\OperationContext.cs" /> | |
106 | <Compile Include="Diagnostics\TraceContext.cs" /> |
|
107 | <Compile Include="Diagnostics\TraceContext.cs" /> | |
107 | <Compile Include="Diagnostics\LogEventArgs.cs" /> |
|
108 | <Compile Include="Diagnostics\LogEventArgs.cs" /> |
@@ -1,18 +1,21 | |||||
1 |
using System |
|
1 | using System; | |
2 | using System; |
|
2 | using System.Collections.Generic; | |
3 |
|
3 | using System.Linq; | ||
4 | namespace Implab { |
|
4 | using System.Text; | |
5 | public class SyncContextPromise<T> : Promise<T> { |
|
5 | using System.Threading; | |
6 | readonly SynchronizationContext m_context; |
|
6 | ||
7 |
|
7 | namespace Implab { | ||
8 |
|
|
8 | public class SyncContextPromise : Promise { | |
9 | Safe.ArgumentNotNull(context, "context"); |
|
9 | readonly SynchronizationContext m_context; | |
10 | m_context = context; |
|
10 | ||
11 | } |
|
11 | public SyncContextPromise(SynchronizationContext context) { | |
12 |
|
12 | Safe.ArgumentNotNull(context, "context"); | ||
13 | protected override void SignalHandler(HandlerDescriptor handler, int signal) { |
|
13 | ||
14 | m_context.Post(x => base.SignalHandler(handler, signal), null); |
|
14 | m_context = context; | |
15 | } |
|
15 | } | |
16 | } |
|
16 | ||
17 | } |
|
17 | protected override void SignalHandler(HandlerDescriptor handler, int signal) { | |
18 |
|
18 | m_context.Post(x => base.SignalHandler(handler, signal), null); | ||
|
19 | } | |||
|
20 | } | |||
|
21 | } |
General Comments 3
ok, latest stable version should be in default
You need to be logged in to leave comments.
Login now