Mercurial > pub > ImplabNet
comparison Implab/PromiseExtensions.cs @ 138:f75cfa58e3d4 v2
added ICancellable.Cancel(Exception) to allow specify the reason of cancellation
| author | cin |
|---|---|
| date | Tue, 17 Feb 2015 18:16:26 +0300 |
| parents | e9e7940c7d98 |
| children | 706fccb85524 |
comparison
equal
deleted
inserted
replaced
| 137:238e15580926 | 138:f75cfa58e3d4 |
|---|---|
| 54 /// <typeparam name="T">The 2nd type parameter.</typeparam> | 54 /// <typeparam name="T">The 2nd type parameter.</typeparam> |
| 55 public static TPromise EnsureDispatched<TPromise,T>(this TPromise that, IPromise<T> head, Action<T> cleanup) where TPromise : IPromise{ | 55 public static TPromise EnsureDispatched<TPromise,T>(this TPromise that, IPromise<T> head, Action<T> cleanup) where TPromise : IPromise{ |
| 56 Safe.ArgumentNotNull(that, "that"); | 56 Safe.ArgumentNotNull(that, "that"); |
| 57 Safe.ArgumentNotNull(head, "head"); | 57 Safe.ArgumentNotNull(head, "head"); |
| 58 | 58 |
| 59 that.On(null,null,() => head.On(cleanup)); | 59 that.On(() => head.On(cleanup), PromiseEventType.Cancelled); |
| 60 | 60 |
| 61 return that; | 61 return that; |
| 62 } | 62 } |
| 63 | 63 |
| 64 public static AsyncCallback AsyncCallback<T>(this Promise<T> that, Func<IAsyncResult,T> callback) { | 64 public static AsyncCallback AsyncCallback<T>(this Promise<T> that, Func<IAsyncResult,T> callback) { |
| 121 if (Interlocked.Increment(ref errors) == 1) | 121 if (Interlocked.Increment(ref errors) == 1) |
| 122 medium.Reject( | 122 medium.Reject( |
| 123 new Exception("The dependency promise is failed", error) | 123 new Exception("The dependency promise is failed", error) |
| 124 ); | 124 ); |
| 125 }, | 125 }, |
| 126 () => { | 126 reason => { |
| 127 if (Interlocked.Increment(ref errors) == 1) | 127 if (Interlocked.Increment(ref errors) == 1) |
| 128 medium.Reject( | 128 medium.Cancel( |
| 129 new Exception("The dependency promise is cancelled") | 129 new Exception("The dependency promise is cancelled") |
| 130 ); | 130 ); |
| 131 } | 131 } |
| 132 ); | 132 ); |
| 133 | 133 |
| 160 if (Interlocked.Increment(ref errors) == 1) | 160 if (Interlocked.Increment(ref errors) == 1) |
| 161 medium.Reject( | 161 medium.Reject( |
| 162 new Exception("The dependency promise is failed", error) | 162 new Exception("The dependency promise is failed", error) |
| 163 ); | 163 ); |
| 164 }, | 164 }, |
| 165 () => { | 165 reason => { |
| 166 if (Interlocked.Increment(ref errors) == 1) | 166 if (Interlocked.Increment(ref errors) == 1) |
| 167 medium.Reject( | 167 medium.Cancel( |
| 168 new Exception("The dependency promise is cancelled") | 168 new Exception("The dependency promise is cancelled", reason) |
| 169 ); | 169 ); |
| 170 } | 170 } |
| 171 ); | 171 ); |
| 172 i++; | 172 i++; |
| 173 } | 173 } |
| 179 | 179 |
| 180 public static Task<T> GetTask<T>(this IPromise<T> that) { | 180 public static Task<T> GetTask<T>(this IPromise<T> that) { |
| 181 Safe.ArgumentNotNull(that, "that"); | 181 Safe.ArgumentNotNull(that, "that"); |
| 182 var tcs = new TaskCompletionSource<T>(); | 182 var tcs = new TaskCompletionSource<T>(); |
| 183 | 183 |
| 184 that.On(tcs.SetResult, tcs.SetException, tcs.SetCanceled); | 184 that.On(tcs.SetResult, tcs.SetException, r => tcs.SetCanceled()); |
| 185 | 185 |
| 186 return tcs.Task; | 186 return tcs.Task; |
| 187 } | 187 } |
| 188 | 188 |
| 189 #endif | 189 #endif |
