comparison Implab/PromiseExtensions.cs @ 124:a336cb13c6a9 v2

major update, added Drain mathod to AsyncQueue class
author cin
date Thu, 15 Jan 2015 02:43:14 +0300
parents 2573b562e328
children e9e7940c7d98
comparison
equal deleted inserted replaced
123:f4d6ea6969cc 124:a336cb13c6a9
92 var timer = new Timer(CancelCallback, that, milliseconds, -1); 92 var timer = new Timer(CancelCallback, that, milliseconds, -1);
93 that.On(timer.Dispose, PromiseEventType.All); 93 that.On(timer.Dispose, PromiseEventType.All);
94 return that; 94 return that;
95 } 95 }
96 96
97 public static IPromise Combine(this ICollection<IPromise> that) { 97 public static IPromise Bundle(this ICollection<IPromise> that) {
98 Safe.ArgumentNotNull(that, "that"); 98 Safe.ArgumentNotNull(that, "that");
99 99
100 int count = that.Count; 100 int count = that.Count;
101 int errors = 0;
101 var medium = new Promise(); 102 var medium = new Promise();
103
104 medium.On(() => {
105 foreach(var p2 in that)
106 p2.Cancel();
107 }, PromiseEventType.ErrorOrCancel);
102 108
103 foreach (var p in that) 109 foreach (var p in that)
104 p.On( 110 p.On(
105 () => { 111 () => {
106 if (Interlocked.Decrement(ref count) == 0) 112 if (Interlocked.Decrement(ref count) == 0)
107 medium.Resolve(); 113 medium.Resolve();
108 }, 114 },
109 error => { 115 error => {
110 throw new Exception("The dependency promise is failed", error); 116 if (Interlocked.Increment(ref errors) == 1)
117 medium.Reject(
118 new Exception("The dependency promise is failed", error)
119 );
111 }, 120 },
112 () => { 121 () => {
113 throw new OperationCanceledException("The dependency promise is cancelled"); 122 if (Interlocked.Increment(ref errors) == 1)
123 medium.Reject(
124 new Exception("The dependency promise is cancelled")
125 );
114 } 126 }
115 ); 127 );
128
129 return medium;
130 }
131
132 public static IPromise<T[]> Bundle<T>(this ICollection<IPromise<T>> that) {
133 Safe.ArgumentNotNull(that, "that");
134
135 int count = that.Count;
136 int errors = 0;
137 var medium = new Promise<T[]>();
138 var results = new T[that.Count];
139
140 medium.On(() => {
141 foreach(var p2 in that)
142 p2.Cancel();
143 }, PromiseEventType.ErrorOrCancel);
144
145 int i = 0;
146 foreach (var p in that) {
147 var idx = i;
148 p.On(
149 x => {
150 results[idx] = x;
151 if (Interlocked.Decrement(ref count) == 0)
152 medium.Resolve(results);
153 },
154 error => {
155 if (Interlocked.Increment(ref errors) == 1)
156 medium.Reject(
157 new Exception("The dependency promise is failed", error)
158 );
159 },
160 () => {
161 if (Interlocked.Increment(ref errors) == 1)
162 medium.Reject(
163 new Exception("The dependency promise is cancelled")
164 );
165 }
166 );
167 i++;
168 }
116 169
117 return medium; 170 return medium;
118 } 171 }
119 172
120 #if NET_4_5 173 #if NET_4_5