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
                    
                