##// END OF EJS Templates
Code review, added a non generic version of SyncContextPromise
cin -
r211:3eb3255d8cc5 v2
parent child
Show More
@@ -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.Threading;
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 public SyncContextPromise(SynchronizationContext context) {
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
Under Review
author

Auto status change to "Under Review"

Approved
author

ok, latest stable version should be in default

You need to be logged in to leave comments. Login now