##// END OF EJS Templates
Added support for 'await' operator to promises
cin -
r151:ec91a6dfa5b3 v2
parent child
Show More
@@ -0,0 +1,28
1 using System;
2 using System.Runtime.CompilerServices;
3
4 namespace Implab {
5 public struct PromiseAwaiter : INotifyCompletion {
6 readonly IPromise m_promise;
7
8 public PromiseAwaiter(IPromise promise) {
9 m_promise = promise;
10 }
11
12 public void OnCompleted (Action continuation) {
13 if (m_promise != null)
14 m_promise.On(continuation, PromiseEventType.All);
15 }
16
17 public void GetResult() {
18 m_promise.Join();
19 }
20
21 public bool IsCompleted {
22 get {
23 return m_promise.IsResolved;
24 }
25 }
26 }
27 }
28
@@ -0,0 +1,28
1 using System;
2 using System.Runtime.CompilerServices;
3
4 namespace Implab {
5 public struct PromiseAwaiter<T> : INotifyCompletion {
6 readonly IPromise<T> m_promise;
7
8 public PromiseAwaiter(IPromise<T> promise) {
9 m_promise = promise;
10 }
11
12 public void OnCompleted (Action continuation) {
13 if (m_promise != null)
14 m_promise.On(continuation, PromiseEventType.All);
15 }
16
17 public T GetResult() {
18 return m_promise.Join();
19 }
20
21 public bool IsCompleted {
22 get {
23 return m_promise.IsResolved;
24 }
25 }
26 }
27 }
28
@@ -1,82 +1,83
1 1 ο»Ώ<?xml version="1.0" encoding="utf-8"?>
2 2 <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 3 <PropertyGroup>
4 4 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5 5 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6 6 <ProductVersion>8.0.30703</ProductVersion>
7 7 <SchemaVersion>2.0</SchemaVersion>
8 8 <ProjectGuid>{06E706F8-6881-43EB-927E-FFC503AF6ABC}</ProjectGuid>
9 9 <OutputType>Library</OutputType>
10 10 <AppDesignerFolder>Properties</AppDesignerFolder>
11 11 <RootNamespace>Implab.Fx</RootNamespace>
12 12 <AssemblyName>Implab.Fx</AssemblyName>
13 13 <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
14 14 <FileAlignment>512</FileAlignment>
15 <ReleaseVersion>0.2</ReleaseVersion>
15 16 </PropertyGroup>
16 17 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
17 18 <DebugSymbols>true</DebugSymbols>
18 19 <DebugType>full</DebugType>
19 20 <Optimize>false</Optimize>
20 21 <OutputPath>bin\Debug\</OutputPath>
21 22 <DefineConstants>DEBUG;TRACE</DefineConstants>
22 23 <ErrorReport>prompt</ErrorReport>
23 24 <WarningLevel>4</WarningLevel>
24 25 </PropertyGroup>
25 26 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
26 27 <DebugType>pdbonly</DebugType>
27 28 <Optimize>true</Optimize>
28 29 <OutputPath>bin\Release\</OutputPath>
29 30 <DefineConstants>TRACE</DefineConstants>
30 31 <ErrorReport>prompt</ErrorReport>
31 32 <WarningLevel>4</WarningLevel>
32 33 </PropertyGroup>
33 34 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug 4.5|AnyCPU' ">
34 35 <DebugSymbols>true</DebugSymbols>
35 36 <DebugType>full</DebugType>
36 37 <Optimize>false</Optimize>
37 38 <OutputPath>bin\Debug\</OutputPath>
38 39 <DefineConstants>DEBUG;TRACE</DefineConstants>
39 40 <ErrorReport>prompt</ErrorReport>
40 41 <WarningLevel>4</WarningLevel>
41 42 </PropertyGroup>
42 43 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release 4.5|AnyCPU' ">
43 44 <DebugType>pdbonly</DebugType>
44 45 <Optimize>true</Optimize>
45 46 <OutputPath>bin\Release\</OutputPath>
46 47 <DefineConstants>TRACE</DefineConstants>
47 48 <ErrorReport>prompt</ErrorReport>
48 49 <WarningLevel>4</WarningLevel>
49 50 </PropertyGroup>
50 51 <ItemGroup>
51 52 <Reference Include="System" />
52 53 <Reference Include="System.Core" />
53 54 <Reference Include="System.Drawing" />
54 55 <Reference Include="System.Windows.Forms" />
55 56 <Reference Include="System.Xml.Linq" />
56 57 <Reference Include="System.Data.DataSetExtensions" />
57 58 <Reference Include="Microsoft.CSharp" />
58 59 <Reference Include="System.Data" />
59 60 <Reference Include="System.Xml" />
60 61 </ItemGroup>
61 62 <ItemGroup>
62 63 <Compile Include="Animation.cs" />
63 64 <Compile Include="AnimationHelpers.cs" />
64 65 <Compile Include="PromiseHelpers.cs" />
65 66 <Compile Include="Properties\AssemblyInfo.cs" />
66 67 <Compile Include="ControlBoundPromise.cs" />
67 68 </ItemGroup>
68 69 <ItemGroup>
69 70 <ProjectReference Include="..\Implab\Implab.csproj">
70 71 <Project>{F550F1F8-8746-4AD0-9614-855F4C4B7F05}</Project>
71 72 <Name>Implab</Name>
72 73 </ProjectReference>
73 74 </ItemGroup>
74 75 <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
75 76 <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
76 77 Other similar extension points exist, see Microsoft.Common.targets.
77 78 <Target Name="BeforeBuild">
78 79 </Target>
79 80 <Target Name="AfterBuild">
80 81 </Target>
81 82 -->
82 83 </Project> No newline at end of file
@@ -1,850 +1,863
1 1 using System;
2 2 using System.Reflection;
3 3 using System.Threading;
4 4 using Implab.Parallels;
5 5
6 6 #if MONO
7 7
8 8 using NUnit.Framework;
9 9 using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
10 10 using TestMethodAttribute = NUnit.Framework.TestAttribute;
11 11
12 12 #else
13 13
14 14 using Microsoft.VisualStudio.TestTools.UnitTesting;
15 15
16 16 #endif
17 17
18 18 namespace Implab.Test {
19 19 [TestClass]
20 20 public class AsyncTests {
21 21 [TestMethod]
22 22 public void ResolveTest() {
23 23 int res = -1;
24 24 var p = new Promise<int>();
25 25 p.Then(x => res = x);
26 26 p.Resolve(100);
27 27
28 28 Assert.AreEqual(100, res);
29 29 }
30 30
31 31 [TestMethod]
32 32 public void RejectTest() {
33 33 int res = -1;
34 34 Exception err = null;
35 35
36 36 var p = new Promise<int>();
37 37 p.Then(
38 38 x => res = x,
39 39 e => {
40 40 err = e;
41 41 return -2;
42 42 }
43 43 );
44 44 p.Reject(new ApplicationException("error"));
45 45
46 46 Assert.AreEqual(res, -1);
47 47 Assert.AreEqual(err.Message, "error");
48 48
49 49 }
50 50
51 51 [TestMethod]
52 52 public void CancelExceptionTest() {
53 53 var p = new Promise<bool>();
54 54 p.CancelOperation(null);
55 55
56 56 var p2 = p.Then(x => x, null, reason => {
57 57 throw new ApplicationException("CANCELLED");
58 58 });
59 59
60 60 try {
61 61 p2.Join();
62 62 Assert.Fail();
63 63 } catch (ApplicationException err) {
64 64 Assert.AreEqual("CANCELLED", err.InnerException.Message);
65 65 }
66 66
67 67 }
68 68
69 69 [TestMethod]
70 70 public void ContinueOnCancelTest() {
71 71 var p = new Promise<bool>();
72 72 p.CancelOperation(null);
73 73
74 74 var p2 = p
75 75 .Then(x => x, null, reason => {
76 76 throw new ApplicationException("CANCELLED");
77 77 })
78 78 .Then(x => x, e => true);
79 79
80 80 Assert.AreEqual(true, p2.Join());
81 81 }
82 82
83 83 [TestMethod]
84 84 public void JoinSuccessTest() {
85 85 var p = new Promise<int>();
86 86 p.Resolve(100);
87 87 Assert.AreEqual(p.Join(), 100);
88 88 }
89 89
90 90 [TestMethod]
91 91 public void JoinFailTest() {
92 92 var p = new Promise<int>();
93 93 p.Reject(new ApplicationException("failed"));
94 94
95 95 try {
96 96 p.Join();
97 97 throw new ApplicationException("WRONG!");
98 98 } catch (TargetInvocationException err) {
99 99 Assert.AreEqual(err.InnerException.Message, "failed");
100 100 } catch {
101 101 Assert.Fail("Got wrong excaption");
102 102 }
103 103 }
104 104
105 105 [TestMethod]
106 106 public void MapTest() {
107 107 var p = new Promise<int>();
108 108
109 109 var p2 = p.Then(x => x.ToString());
110 110 p.Resolve(100);
111 111
112 112 Assert.AreEqual(p2.Join(), "100");
113 113 }
114 114
115 115 [TestMethod]
116 116 public void FixErrorTest() {
117 117 var p = new Promise<int>();
118 118
119 119 var p2 = p.Then(x => x, e => 101);
120 120
121 121 p.Reject(new Exception());
122 122
123 123 Assert.AreEqual(p2.Join(), 101);
124 124 }
125 125
126 126 [TestMethod]
127 127 public void ChainTest() {
128 128 var p1 = new Promise<int>();
129 129
130 130 var p3 = p1.Chain(x => {
131 131 var p2 = new Promise<string>();
132 132 p2.Resolve(x.ToString());
133 133 return p2;
134 134 });
135 135
136 136 p1.Resolve(100);
137 137
138 138 Assert.AreEqual(p3.Join(), "100");
139 139 }
140 140
141 141 [TestMethod]
142 142 public void ChainFailTest() {
143 143 var p1 = new Promise<int>();
144 144
145 145 var p3 = p1.Chain(x => {
146 146 var p2 = new Promise<string>();
147 147 p2.Reject(new Exception("DIE!!!"));
148 148 return p2;
149 149 });
150 150
151 151 p1.Resolve(100);
152 152
153 153 Assert.IsTrue(p3.IsResolved);
154 154 }
155 155
156 156 [TestMethod]
157 157 public void PoolTest() {
158 158 var pid = Thread.CurrentThread.ManagedThreadId;
159 159 var p = AsyncPool.Invoke(() => Thread.CurrentThread.ManagedThreadId);
160 160
161 161 Assert.AreNotEqual(pid, p.Join());
162 162 }
163 163
164 164 [TestMethod]
165 165 public void WorkerPoolSizeTest() {
166 166 var pool = new WorkerPool(5, 10, 1);
167 167
168 168 Assert.AreEqual(5, pool.PoolSize);
169 169
170 170 pool.Invoke(() => { Thread.Sleep(100000000); return 10; });
171 171 pool.Invoke(() => { Thread.Sleep(100000000); return 10; });
172 172 pool.Invoke(() => { Thread.Sleep(100000000); return 10; });
173 173
174 174 Assert.AreEqual(5, pool.PoolSize);
175 175
176 176 for (int i = 0; i < 100; i++)
177 177 pool.Invoke(() => { Thread.Sleep(100000000); return 10; });
178 178 Thread.Sleep(200);
179 179 Assert.AreEqual(10, pool.PoolSize);
180 180
181 181 pool.Dispose();
182 182 }
183 183
184 184 [TestMethod]
185 185 public void WorkerPoolCorrectTest() {
186 186 var pool = new WorkerPool(0,1000,100);
187 187
188 188 const int iterations = 1000;
189 189 int pending = iterations;
190 190 var stop = new ManualResetEvent(false);
191 191
192 192 var count = 0;
193 193 for (int i = 0; i < iterations; i++) {
194 194 pool
195 195 .Invoke(() => 1)
196 196 .Then(x => Interlocked.Add(ref count, x))
197 197 .Then(x => Math.Log10(x))
198 198 .On(() => {
199 199 Interlocked.Decrement(ref pending);
200 200 if (pending == 0)
201 201 stop.Set();
202 202 }, PromiseEventType.All);
203 203 }
204 204
205 205 stop.WaitOne();
206 206
207 207 Assert.AreEqual(iterations, count);
208 208 Console.WriteLine("Max threads: {0}", pool.MaxRunningThreads);
209 209 pool.Dispose();
210 210
211 211 }
212 212
213 213 [TestMethod]
214 214 public void WorkerPoolDisposeTest() {
215 215 var pool = new WorkerPool(5, 20);
216 216 Assert.AreEqual(5, pool.PoolSize);
217 217 pool.Dispose();
218 218 Thread.Sleep(500);
219 219 Assert.AreEqual(0, pool.PoolSize);
220 220 pool.Dispose();
221 221 }
222 222
223 223 [TestMethod]
224 224 public void MTQueueTest() {
225 225 var queue = new MTQueue<int>();
226 226 int res;
227 227
228 228 queue.Enqueue(10);
229 229 Assert.IsTrue(queue.TryDequeue(out res));
230 230 Assert.AreEqual(10, res);
231 231 Assert.IsFalse(queue.TryDequeue(out res));
232 232
233 233 for (int i = 0; i < 1000; i++)
234 234 queue.Enqueue(i);
235 235
236 236 for (int i = 0; i < 1000; i++) {
237 237 queue.TryDequeue(out res);
238 238 Assert.AreEqual(i, res);
239 239 }
240 240
241 241 int writers = 0;
242 242 int readers = 0;
243 243 var stop = new ManualResetEvent(false);
244 244 int total = 0;
245 245
246 246 const int itemsPerWriter = 10000;
247 247 const int writersCount = 10;
248 248
249 249 for (int i = 0; i < writersCount; i++) {
250 250 Interlocked.Increment(ref writers);
251 251 AsyncPool
252 252 .RunThread(() => {
253 253 for (int ii = 0; ii < itemsPerWriter; ii++) {
254 254 queue.Enqueue(1);
255 255 }
256 256 return 1;
257 257 })
258 258 .On(() => Interlocked.Decrement(ref writers), PromiseEventType.All);
259 259 }
260 260
261 261 for (int i = 0; i < 10; i++) {
262 262 Interlocked.Increment(ref readers);
263 263 AsyncPool
264 264 .RunThread(() => {
265 265 int t;
266 266 do {
267 267 while (queue.TryDequeue(out t))
268 268 Interlocked.Add(ref total, t);
269 269 } while (writers > 0);
270 270 return 1;
271 271 })
272 272 .On(() => {
273 273 Interlocked.Decrement(ref readers);
274 274 if (readers == 0)
275 275 stop.Set();
276 276 }, PromiseEventType.All);
277 277 }
278 278
279 279 stop.WaitOne();
280 280
281 281 Assert.AreEqual(100000, total);
282 282 }
283 283
284 284 [TestMethod]
285 285 public void AsyncQueueTest() {
286 286 var queue = new AsyncQueue<int>();
287 287 int res;
288 288
289 289 queue.Enqueue(10);
290 290 Assert.IsTrue(queue.TryDequeue(out res));
291 291 Assert.AreEqual(10, res);
292 292 Assert.IsFalse(queue.TryDequeue(out res));
293 293
294 294 for (int i = 0; i < 1000; i++)
295 295 queue.Enqueue(i);
296 296
297 297 for (int i = 0; i < 1000; i++) {
298 298 queue.TryDequeue(out res);
299 299 Assert.AreEqual(i, res);
300 300 }
301 301
302 302 const int count = 10000000;
303 303
304 304 int res1 = 0, res2 = 0;
305 305 var t1 = Environment.TickCount;
306 306
307 307 AsyncPool.RunThread(
308 308 () => {
309 309 for (var i = 0; i < count; i++)
310 310 queue.Enqueue(1);
311 311 Console.WriteLine("done writer #1: {0} ms", Environment.TickCount - t1);
312 312 },
313 313 () => {
314 314 for (var i = 0; i < count; i++)
315 315 queue.Enqueue(2);
316 316 Console.WriteLine("done writer #2: {0} ms", Environment.TickCount - t1);
317 317 },
318 318 () => {
319 319 int temp;
320 320 int i = 0;
321 321 while (i < count)
322 322 if (queue.TryDequeue(out temp)) {
323 323 i++;
324 324 res1 += temp;
325 325 }
326 326 Console.WriteLine("done reader #1: {0} ms", Environment.TickCount - t1);
327 327 },
328 328 () => {
329 329 int temp;
330 330 int i = 0;
331 331 while (i < count)
332 332 if (queue.TryDequeue(out temp)) {
333 333 i++;
334 334 res2 += temp;
335 335 }
336 336 Console.WriteLine("done reader #2: {0} ms", Environment.TickCount - t1);
337 337 }
338 338 )
339 339 .Bundle()
340 340 .Join();
341 341
342 342 Assert.AreEqual(count * 3, res1 + res2);
343 343
344 344 Console.WriteLine(
345 345 "done: {0} ms, summ#1: {1}, summ#2: {2}, total: {3}, count: {4}",
346 346 Environment.TickCount - t1,
347 347 res1,
348 348 res2,
349 349 res1 + res2,
350 350 count
351 351 );
352 352 }
353 353
354 354 [TestMethod]
355 355 public void AsyncQueueBatchTest() {
356 356 var queue = new AsyncQueue<int>();
357 357
358 358 const int wBatch = 29;
359 359 const int wCount = 400000;
360 360 const int total = wBatch * wCount * 2;
361 361 const int summ = wBatch * wCount * 3;
362 362
363 363 int r1 = 0, r2 = 0;
364 364 const int rBatch = 111;
365 365 int read = 0;
366 366
367 367 var t1 = Environment.TickCount;
368 368
369 369 AsyncPool.RunThread(
370 370 () => {
371 371 var buffer = new int[wBatch];
372 372 for(int i = 0; i<wBatch; i++)
373 373 buffer[i] = 1;
374 374
375 375 for(int i =0; i < wCount; i++)
376 376 queue.EnqueueRange(buffer,0,wBatch);
377 377 Console.WriteLine("done writer #1: {0} ms", Environment.TickCount - t1);
378 378 },
379 379 () => {
380 380 var buffer = new int[wBatch];
381 381 for(int i = 0; i<wBatch; i++)
382 382 buffer[i] = 2;
383 383
384 384 for(int i =0; i < wCount; i++)
385 385 queue.EnqueueRange(buffer,0,wBatch);
386 386 Console.WriteLine("done writer #2: {0} ms", Environment.TickCount - t1);
387 387 },
388 388 () => {
389 389 var buffer = new int[rBatch];
390 390
391 391 while(read < total) {
392 392 int actual;
393 393 if (queue.TryDequeueRange(buffer,0,rBatch,out actual)) {
394 394 for(int i=0; i< actual; i++)
395 395 r1 += buffer[i];
396 396 Interlocked.Add(ref read, actual);
397 397 }
398 398 }
399 399
400 400 Console.WriteLine("done reader #1: {0} ms", Environment.TickCount - t1);
401 401 },
402 402 () => {
403 403 var buffer = new int[rBatch];
404 404
405 405 while(read < total) {
406 406 int actual;
407 407 if (queue.TryDequeueRange(buffer,0,rBatch,out actual)) {
408 408 for(int i=0; i< actual; i++)
409 409 r2 += buffer[i];
410 410 Interlocked.Add(ref read, actual);
411 411 }
412 412 }
413 413
414 414 Console.WriteLine("done reader #2: {0} ms", Environment.TickCount - t1);
415 415 }
416 416 )
417 417 .Bundle()
418 418 .Join();
419 419
420 420 Assert.AreEqual(summ , r1 + r2);
421 421
422 422 Console.WriteLine(
423 423 "done: {0} ms, summ#1: {1}, summ#2: {2}, total: {3}, count: {4}",
424 424 Environment.TickCount - t1,
425 425 r1,
426 426 r2,
427 427 r1 + r2,
428 428 total
429 429 );
430 430 }
431 431
432 432 [TestMethod]
433 433 public void AsyncQueueChunkDequeueTest() {
434 434 var queue = new AsyncQueue<int>();
435 435
436 436 const int wBatch = 31;
437 437 const int wCount = 200000;
438 438 const int total = wBatch * wCount * 3;
439 439 const int summ = wBatch * wCount * 6;
440 440
441 441 int r1 = 0, r2 = 0;
442 442 const int rBatch = 1024;
443 443 int read = 0;
444 444
445 445 var t1 = Environment.TickCount;
446 446
447 447 AsyncPool.RunThread(
448 448 () => {
449 449 var buffer = new int[wBatch];
450 450 for(int i = 0; i<wBatch; i++)
451 451 buffer[i] = 1;
452 452
453 453 for(int i =0; i < wCount; i++)
454 454 queue.EnqueueRange(buffer,0,wBatch);
455 455 Console.WriteLine("done writer #1: {0} ms", Environment.TickCount - t1);
456 456 },
457 457 () => {
458 458 var buffer = new int[wBatch];
459 459 for(int i = 0; i<wBatch; i++)
460 460 buffer[i] = 2;
461 461
462 462 for(int i =0; i < wCount; i++)
463 463 queue.EnqueueRange(buffer,0,wBatch);
464 464 Console.WriteLine("done writer #2: {0} ms", Environment.TickCount - t1);
465 465 },
466 466 () => {
467 467 var buffer = new int[wBatch];
468 468 for(int i = 0; i<wBatch; i++)
469 469 buffer[i] = 3;
470 470
471 471 for(int i =0; i < wCount; i++)
472 472 queue.EnqueueRange(buffer,0,wBatch);
473 473 Console.WriteLine("done writer #3: {0} ms", Environment.TickCount - t1);
474 474 },
475 475 () => {
476 476 var buffer = new int[rBatch];
477 477 int count = 1;
478 478 double avgchunk = 0;
479 479 while(read < total) {
480 480 int actual;
481 481 if (queue.TryDequeueChunk(buffer,0,rBatch,out actual)) {
482 482 for(int i=0; i< actual; i++)
483 483 r2 += buffer[i];
484 484 Interlocked.Add(ref read, actual);
485 485 avgchunk = avgchunk*(count-1)/count + actual/(double)count;
486 486 count ++;
487 487 }
488 488 }
489 489
490 490 Console.WriteLine("done reader #2: {0} ms, avg chunk size: {1}", Environment.TickCount - t1, avgchunk);
491 491 }
492 492 )
493 493 .Bundle()
494 494 .Join();
495 495
496 496 Assert.AreEqual(summ , r1 + r2);
497 497
498 498 Console.WriteLine(
499 499 "done: {0} ms, summ#1: {1}, summ#2: {2}, total: {3}, count: {4}",
500 500 Environment.TickCount - t1,
501 501 r1,
502 502 r2,
503 503 r1 + r2,
504 504 total
505 505 );
506 506 }
507 507
508 508 [TestMethod]
509 509 public void AsyncQueueDrainTest() {
510 510 var queue = new AsyncQueue<int>();
511 511
512 512 const int wBatch = 11;
513 513 const int wCount = 200000;
514 514 const int total = wBatch * wCount * 3;
515 515 const int summ = wBatch * wCount * 3;
516 516
517 517 int r1 = 0, r2 = 0;
518 518 const int rBatch = 11;
519 519 int read = 0;
520 520
521 521 var t1 = Environment.TickCount;
522 522
523 523 AsyncPool.RunThread(
524 524 () => {
525 525 var buffer = new int[wBatch];
526 526 for(int i = 0; i<wBatch; i++)
527 527 buffer[i] = 1;
528 528
529 529 for(int i =0; i < wCount; i++)
530 530 queue.EnqueueRange(buffer,0,wBatch);
531 531 Console.WriteLine("done writer #1: {0} ms", Environment.TickCount - t1);
532 532 },
533 533 () => {
534 534 for(int i =0; i < wCount * wBatch; i++)
535 535 queue.Enqueue(1);
536 536 Console.WriteLine("done writer #2: {0} ms", Environment.TickCount - t1);
537 537 },
538 538 () => {
539 539 var buffer = new int[wBatch];
540 540 for(int i = 0; i<wBatch; i++)
541 541 buffer[i] = 1;
542 542
543 543 for(int i =0; i < wCount; i++)
544 544 queue.EnqueueRange(buffer,0,wBatch);
545 545 Console.WriteLine("done writer #3: {0} ms", Environment.TickCount - t1);
546 546 },
547 547 /*() => {
548 548 int temp;
549 549 int count = 0;
550 550 while (read < total)
551 551 if (queue.TryDequeue(out temp)) {
552 552 count++;
553 553 r1 += temp;
554 554 Interlocked.Increment(ref read);
555 555 }
556 556 Console.WriteLine("done reader #1: {0} ms, {1} count", Environment.TickCount - t1, count);
557 557 },*/
558 558 /*() => {
559 559 var buffer = new int[rBatch];
560 560 var count = 0;
561 561 while(read < total) {
562 562 int actual;
563 563 if (queue.TryDequeueRange(buffer,0,rBatch,out actual)) {
564 564 for(int i=0; i< actual; i++)
565 565 r1 += buffer[i];
566 566 Interlocked.Add(ref read, actual);
567 567 count += actual;
568 568 }
569 569 }
570 570
571 571 Console.WriteLine("done reader #1: {0} ms, {1} items", Environment.TickCount - t1, count);
572 572 },*/
573 573 () => {
574 574 var count = 0;
575 575 while(read < total) {
576 576 var buffer = queue.Drain();
577 577 for(int i=0; i< buffer.Length; i++)
578 578 r1 += buffer[i];
579 579 Interlocked.Add(ref read, buffer.Length);
580 580 count += buffer.Length;
581 581 }
582 582 Console.WriteLine("done reader #1: {0} ms, {1} items", Environment.TickCount - t1, count);
583 583 },
584 584 () => {
585 585 var count = 0;
586 586 while(read < total) {
587 587 var buffer = queue.Drain();
588 588 for(int i=0; i< buffer.Length; i++)
589 589 r2 += buffer[i];
590 590 Interlocked.Add(ref read, buffer.Length);
591 591 count += buffer.Length;
592 592 }
593 593 Console.WriteLine("done reader #2: {0} ms, {1} items", Environment.TickCount - t1, count);
594 594 }
595 595 )
596 596 .Bundle()
597 597 .Join();
598 598
599 599 Assert.AreEqual(summ , r1 + r2);
600 600
601 601 Console.WriteLine(
602 602 "done: {0} ms, summ#1: {1}, summ#2: {2}, total: {3}, count: {4}",
603 603 Environment.TickCount - t1,
604 604 r1,
605 605 r2,
606 606 r1 + r2,
607 607 total
608 608 );
609 609 }
610 610
611 611 [TestMethod]
612 612 public void ParallelMapTest() {
613 613
614 614 const int count = 100000;
615 615
616 616 var args = new double[count];
617 617 var rand = new Random();
618 618
619 619 for (int i = 0; i < count; i++)
620 620 args[i] = rand.NextDouble();
621 621
622 622 var t = Environment.TickCount;
623 623 var res = args.ParallelMap(x => Math.Sin(x*x), 4).Join();
624 624
625 625 Console.WriteLine("Map complete in {0} ms", Environment.TickCount - t);
626 626
627 627 t = Environment.TickCount;
628 628 for (int i = 0; i < count; i++)
629 629 Assert.AreEqual(Math.Sin(args[i] * args[i]), res[i]);
630 630 Console.WriteLine("Verified in {0} ms", Environment.TickCount - t);
631 631 }
632 632
633 633 [TestMethod]
634 634 public void ChainedMapTest() {
635 635
636 636 using (var pool = new WorkerPool()) {
637 637 const int count = 10000;
638 638
639 639 var args = new double[count];
640 640 var rand = new Random();
641 641
642 642 for (int i = 0; i < count; i++)
643 643 args[i] = rand.NextDouble();
644 644
645 645 var t = Environment.TickCount;
646 646 var res = args
647 647 .ChainedMap(
648 648 // Analysis disable once AccessToDisposedClosure
649 649 x => pool.Invoke(
650 650 () => Math.Sin(x * x)
651 651 ),
652 652 4
653 653 )
654 654 .Join();
655 655
656 656 Console.WriteLine("Map complete in {0} ms", Environment.TickCount - t);
657 657
658 658 t = Environment.TickCount;
659 659 for (int i = 0; i < count; i++)
660 660 Assert.AreEqual(Math.Sin(args[i] * args[i]), res[i]);
661 661 Console.WriteLine("Verified in {0} ms", Environment.TickCount - t);
662 662 Console.WriteLine("Max workers: {0}", pool.MaxRunningThreads);
663 663 }
664 664 }
665 665
666 666 [TestMethod]
667 667 public void ParallelForEachTest() {
668 668
669 669 const int count = 100000;
670 670
671 671 var args = new int[count];
672 672 var rand = new Random();
673 673
674 674 for (int i = 0; i < count; i++)
675 675 args[i] = (int)(rand.NextDouble() * 100);
676 676
677 677 int result = 0;
678 678
679 679 var t = Environment.TickCount;
680 680 args.ParallelForEach(x => Interlocked.Add(ref result, x), 4).Join();
681 681
682 682 Console.WriteLine("Iteration complete in {0} ms, result: {1}", Environment.TickCount - t, result);
683 683
684 684 int result2 = 0;
685 685
686 686 t = Environment.TickCount;
687 687 for (int i = 0; i < count; i++)
688 688 result2 += args[i];
689 689 Assert.AreEqual(result2, result);
690 690 Console.WriteLine("Verified in {0} ms", Environment.TickCount - t);
691 691 }
692 692
693 693 [TestMethod]
694 694 public void ComplexCase1Test() {
695 695 var flags = new bool[3];
696 696
697 697 // op1 (aync 200ms) => op2 (async 200ms) => op3 (sync map)
698 698
699 699 var step1 = PromiseHelper
700 700 .Sleep(200, "Alan")
701 701 .On(() => flags[0] = true, PromiseEventType.Cancelled);
702 702 var p = step1
703 703 .Chain(x =>
704 704 PromiseHelper
705 705 .Sleep(200, "Hi, " + x)
706 706 .Then(y => y)
707 707 .On(() => flags[1] = true, PromiseEventType.Cancelled)
708 708 )
709 709 .On(() => flags[2] = true, PromiseEventType.Cancelled);
710 710 step1.Join();
711 711 p.Cancel();
712 712 try {
713 713 Assert.AreEqual(p.Join(), "Hi, Alan");
714 714 Assert.Fail("Shouldn't get here");
715 715 } catch (OperationCanceledException) {
716 716 }
717 717
718 718 Assert.IsFalse(flags[0]);
719 719 Assert.IsTrue(flags[1]);
720 720 Assert.IsTrue(flags[2]);
721 721 }
722 722
723 723 [TestMethod]
724 724 public void ChainedCancel1Test() {
725 725 // ΠΏΡ€ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Π΅ сцСплСнной асинхронной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ всС ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ
726 726 // Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒΡΡ ошибкой OperationCanceledException
727 727 var p = PromiseHelper
728 728 .Sleep(1, "Hi, HAL!")
729 729 .Then(x => {
730 730 // запускаСм Π΄Π²Π΅ асинхронныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
731 731 var result = PromiseHelper.Sleep(1000, "HEM ENABLED!!!");
732 732 // вторая опСрация отмСняСт ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ
733 733 PromiseHelper
734 734 .Sleep(100, "HAL, STOP!")
735 735 .Then(result.Cancel);
736 736 return result;
737 737 });
738 738 try {
739 739 p.Join();
740 740 } catch (TargetInvocationException err) {
741 741 Assert.IsTrue(err.InnerException is OperationCanceledException);
742 742 }
743 743 }
744 744
745 745 [TestMethod]
746 746 public void ChainedCancel2Test() {
747 747 // ΠΏΡ€ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Π΅ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠΉ, Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ
748 748 var pSurvive = new Promise<bool>();
749 749 var hemStarted = new Signal();
750 750 var p = PromiseHelper
751 751 .Sleep(1, "Hi, HAL!")
752 752 .Chain(() => {
753 753 hemStarted.Set();
754 754 // запускаСм Π΄Π²Π΅ асинхронныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
755 755 var result = PromiseHelper
756 756 .Sleep(2000, "HEM ENABLED!!!")
757 757 .Then(() => pSurvive.Resolve(false));
758 758
759 759 result
760 760 .On(() => pSurvive.Resolve(true), PromiseEventType.Cancelled);
761 761
762 762 return result;
763 763 });
764 764
765 765 hemStarted.Wait();
766 766 p.Cancel();
767 767
768 768 try {
769 769 p.Join();
770 770 Assert.Fail();
771 771 } catch (OperationCanceledException) {
772 772 }
773 773 Assert.IsTrue(pSurvive.Join());
774 774 }
775 775
776 776 [TestMethod]
777 777 public void SharedLockTest() {
778 778 var l = new SharedLock();
779 779 int shared = 0;
780 780 int exclusive = 0;
781 781 var s1 = new Signal();
782 782 var log = new AsyncQueue<string>();
783 783
784 784 try {
785 785 AsyncPool.RunThread(
786 786 () => {
787 787 log.Enqueue("Reader #1 started");
788 788 try {
789 789 l.LockShared();
790 790 log.Enqueue("Reader #1 lock got");
791 791 if (Interlocked.Increment(ref shared) == 2)
792 792 s1.Set();
793 793 s1.Wait();
794 794 log.Enqueue("Reader #1 finished");
795 795 Interlocked.Decrement(ref shared);
796 796 } finally {
797 797 l.Release();
798 798 log.Enqueue("Reader #1 lock released");
799 799 }
800 800 },
801 801 () => {
802 802 log.Enqueue("Reader #2 started");
803 803
804 804 try {
805 805 l.LockShared();
806 806 log.Enqueue("Reader #2 lock got");
807 807
808 808 if (Interlocked.Increment(ref shared) == 2)
809 809 s1.Set();
810 810 s1.Wait();
811 811 log.Enqueue("Reader #2 upgrading to writer");
812 812 Interlocked.Decrement(ref shared);
813 813 l.Upgrade();
814 814 log.Enqueue("Reader #2 upgraded");
815 815
816 816 Assert.AreEqual(1, Interlocked.Increment(ref exclusive));
817 817 Assert.AreEqual(0, shared);
818 818 log.Enqueue("Reader #2 finished");
819 819 Interlocked.Decrement(ref exclusive);
820 820 } finally {
821 821 l.Release();
822 822 log.Enqueue("Reader #2 lock released");
823 823 }
824 824 },
825 825 () => {
826 826 log.Enqueue("Writer #1 started");
827 827 try {
828 828 l.LockExclusive();
829 829 log.Enqueue("Writer #1 got the lock");
830 830 Assert.AreEqual(1, Interlocked.Increment(ref exclusive));
831 831 Interlocked.Decrement(ref exclusive);
832 832 log.Enqueue("Writer #1 is finished");
833 833 } finally {
834 834 l.Release();
835 835 log.Enqueue("Writer #1 lock released");
836 836 }
837 837 }
838 838 ).Bundle().Join(1000);
839 839 log.Enqueue("Done");
840 840 } catch(Exception error) {
841 841 log.Enqueue(error.Message);
842 842 throw;
843 843 } finally {
844 844 foreach (var m in log)
845 845 Console.WriteLine(m);
846 846 }
847 847 }
848
849 #if NET_4_5
850
851 [TestMethod]
852 public async void TaskInteropTest() {
853 var promise = new Promise<int>();
854 promise.Resolve(10);
855 var res = await promise;
856
857 Assert.AreEqual(10, res);
858 }
859
860 #endif
848 861 }
849 862 }
850 863
@@ -1,67 +1,68
1 1 <?xml version="1.0" encoding="utf-8"?>
2 2 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 3 <PropertyGroup>
4 4 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5 5 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6 6 <ProductVersion>8.0.30703</ProductVersion>
7 7 <SchemaVersion>2.0</SchemaVersion>
8 8 <ProjectGuid>{2BD05F84-E067-4B87-9477-FDC2676A21C6}</ProjectGuid>
9 9 <OutputType>Library</OutputType>
10 10 <RootNamespace>Implab.Test</RootNamespace>
11 11 <AssemblyName>Implab.Test</AssemblyName>
12 12 <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
13 <ReleaseVersion>0.2</ReleaseVersion>
13 14 </PropertyGroup>
14 15 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
15 16 <DebugSymbols>true</DebugSymbols>
16 17 <DebugType>full</DebugType>
17 18 <Optimize>false</Optimize>
18 19 <OutputPath>bin\Debug</OutputPath>
19 20 <DefineConstants>DEBUG;MONO</DefineConstants>
20 21 <ErrorReport>prompt</ErrorReport>
21 22 <WarningLevel>4</WarningLevel>
22 23 <ConsolePause>false</ConsolePause>
23 24 </PropertyGroup>
24 25 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
25 26 <Optimize>true</Optimize>
26 27 <OutputPath>bin\Release</OutputPath>
27 28 <ErrorReport>prompt</ErrorReport>
28 29 <WarningLevel>4</WarningLevel>
29 30 <ConsolePause>false</ConsolePause>
30 31 <DefineConstants>MONO</DefineConstants>
31 32 </PropertyGroup>
32 33 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug 4.5|AnyCPU' ">
33 34 <DebugSymbols>true</DebugSymbols>
34 35 <DebugType>full</DebugType>
35 36 <Optimize>false</Optimize>
36 37 <OutputPath>bin\Debug</OutputPath>
37 38 <DefineConstants>DEBUG;TRACE;NET_4_5;MONO</DefineConstants>
38 39 <ErrorReport>prompt</ErrorReport>
39 40 <WarningLevel>4</WarningLevel>
40 41 <ConsolePause>false</ConsolePause>
41 42 </PropertyGroup>
42 43 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release 4.5|AnyCPU' ">
43 44 <Optimize>true</Optimize>
44 45 <OutputPath>bin\Release</OutputPath>
45 46 <DefineConstants>NET_4_5;MONO</DefineConstants>
46 47 <ErrorReport>prompt</ErrorReport>
47 48 <WarningLevel>4</WarningLevel>
48 49 <ConsolePause>false</ConsolePause>
49 50 </PropertyGroup>
50 51 <ItemGroup>
51 52 <Reference Include="System" />
52 53 <Reference Include="nunit.framework" />
53 54 </ItemGroup>
54 55 <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
55 56 <ItemGroup>
56 57 <Compile Include="AsyncTests.cs" />
57 58 <Compile Include="PromiseHelper.cs" />
58 59 <Compile Include="Properties\AssemblyInfo.cs" />
59 60 <Compile Include="CancelationTests.cs" />
60 61 </ItemGroup>
61 62 <ItemGroup>
62 63 <ProjectReference Include="..\Implab\Implab.csproj">
63 64 <Project>{F550F1F8-8746-4AD0-9614-855F4C4B7F05}</Project>
64 65 <Name>Implab</Name>
65 66 </ProjectReference>
66 67 </ItemGroup>
67 68 </Project> No newline at end of file
@@ -1,289 +1,290
1 1 ο»Ώ
2 2 Microsoft Visual Studio Solution File, Format Version 11.00
3 3 # Visual Studio 2010
4 4 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Implab", "Implab\Implab.csproj", "{F550F1F8-8746-4AD0-9614-855F4C4B7F05}"
5 5 EndProject
6 6 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{CE8D8D18-437A-445C-B662-4C2CE79A76F6}"
7 7 ProjectSection(SolutionItems) = preProject
8 8 Implab.vsmdi = Implab.vsmdi
9 9 Local.testsettings = Local.testsettings
10 10 TraceAndTestImpact.testsettings = TraceAndTestImpact.testsettings
11 11 EndProjectSection
12 12 EndProject
13 13 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Implab.Fx", "Implab.Fx\Implab.Fx.csproj", "{06E706F8-6881-43EB-927E-FFC503AF6ABC}"
14 14 EndProject
15 15 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{BCA337C3-BFDC-4825-BBDB-E6D467E4E452}"
16 16 EndProject
17 17 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Implab.Test.mono", "Implab.Test\Implab.Test.mono.csproj", "{2BD05F84-E067-4B87-9477-FDC2676A21C6}"
18 18 EndProject
19 19 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoPlay", "MonoPlay\MonoPlay.csproj", "{15DD7123-D504-4627-8B4F-D00C7F04D033}"
20 20 EndProject
21 21 Global
22 22 GlobalSection(SolutionConfigurationPlatforms) = preSolution
23 23 Debug|Any CPU = Debug|Any CPU
24 24 Release|Any CPU = Release|Any CPU
25 25 Debug 4.5|Any CPU = Debug 4.5|Any CPU
26 26 Release 4.5|Any CPU = Release 4.5|Any CPU
27 27 EndGlobalSection
28 28 GlobalSection(ProjectConfigurationPlatforms) = postSolution
29 29 {06E706F8-6881-43EB-927E-FFC503AF6ABC}.Debug 4.5|Any CPU.ActiveCfg = Debug 4.5|Any CPU
30 30 {06E706F8-6881-43EB-927E-FFC503AF6ABC}.Debug 4.5|Any CPU.Build.0 = Debug 4.5|Any CPU
31 31 {06E706F8-6881-43EB-927E-FFC503AF6ABC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
32 32 {06E706F8-6881-43EB-927E-FFC503AF6ABC}.Debug|Any CPU.Build.0 = Debug|Any CPU
33 33 {06E706F8-6881-43EB-927E-FFC503AF6ABC}.Release 4.5|Any CPU.ActiveCfg = Release 4.5|Any CPU
34 34 {06E706F8-6881-43EB-927E-FFC503AF6ABC}.Release 4.5|Any CPU.Build.0 = Release 4.5|Any CPU
35 35 {06E706F8-6881-43EB-927E-FFC503AF6ABC}.Release|Any CPU.ActiveCfg = Release|Any CPU
36 36 {06E706F8-6881-43EB-927E-FFC503AF6ABC}.Release|Any CPU.Build.0 = Release|Any CPU
37 37 {15DD7123-D504-4627-8B4F-D00C7F04D033}.Debug 4.5|Any CPU.ActiveCfg = Debug|Any CPU
38 38 {15DD7123-D504-4627-8B4F-D00C7F04D033}.Debug 4.5|Any CPU.Build.0 = Debug|Any CPU
39 39 {15DD7123-D504-4627-8B4F-D00C7F04D033}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
40 40 {15DD7123-D504-4627-8B4F-D00C7F04D033}.Debug|Any CPU.Build.0 = Debug|Any CPU
41 41 {15DD7123-D504-4627-8B4F-D00C7F04D033}.Release 4.5|Any CPU.ActiveCfg = Release|Any CPU
42 42 {15DD7123-D504-4627-8B4F-D00C7F04D033}.Release 4.5|Any CPU.Build.0 = Release|Any CPU
43 43 {15DD7123-D504-4627-8B4F-D00C7F04D033}.Release|Any CPU.ActiveCfg = Release|Any CPU
44 44 {15DD7123-D504-4627-8B4F-D00C7F04D033}.Release|Any CPU.Build.0 = Release|Any CPU
45 45 {2BD05F84-E067-4B87-9477-FDC2676A21C6}.Debug 4.5|Any CPU.ActiveCfg = Debug 4.5|Any CPU
46 46 {2BD05F84-E067-4B87-9477-FDC2676A21C6}.Debug 4.5|Any CPU.Build.0 = Debug 4.5|Any CPU
47 47 {2BD05F84-E067-4B87-9477-FDC2676A21C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
48 48 {2BD05F84-E067-4B87-9477-FDC2676A21C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
49 49 {2BD05F84-E067-4B87-9477-FDC2676A21C6}.Release 4.5|Any CPU.ActiveCfg = Release 4.5|Any CPU
50 50 {2BD05F84-E067-4B87-9477-FDC2676A21C6}.Release 4.5|Any CPU.Build.0 = Release 4.5|Any CPU
51 51 {2BD05F84-E067-4B87-9477-FDC2676A21C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
52 52 {2BD05F84-E067-4B87-9477-FDC2676A21C6}.Release|Any CPU.Build.0 = Release|Any CPU
53 53 {F550F1F8-8746-4AD0-9614-855F4C4B7F05}.Debug 4.5|Any CPU.ActiveCfg = Debug 4.5|Any CPU
54 54 {F550F1F8-8746-4AD0-9614-855F4C4B7F05}.Debug 4.5|Any CPU.Build.0 = Debug 4.5|Any CPU
55 55 {F550F1F8-8746-4AD0-9614-855F4C4B7F05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
56 56 {F550F1F8-8746-4AD0-9614-855F4C4B7F05}.Debug|Any CPU.Build.0 = Debug|Any CPU
57 57 {F550F1F8-8746-4AD0-9614-855F4C4B7F05}.Release 4.5|Any CPU.ActiveCfg = Release 4.5|Any CPU
58 58 {F550F1F8-8746-4AD0-9614-855F4C4B7F05}.Release 4.5|Any CPU.Build.0 = Release 4.5|Any CPU
59 59 {F550F1F8-8746-4AD0-9614-855F4C4B7F05}.Release|Any CPU.ActiveCfg = Release|Any CPU
60 60 {F550F1F8-8746-4AD0-9614-855F4C4B7F05}.Release|Any CPU.Build.0 = Release|Any CPU
61 61 {2F31E405-E267-4195-A05D-574093C21209}.Debug 4.5|Any CPU.ActiveCfg = Debug 4.5|Any CPU
62 62 {2F31E405-E267-4195-A05D-574093C21209}.Debug 4.5|Any CPU.Build.0 = Debug 4.5|Any CPU
63 63 {2F31E405-E267-4195-A05D-574093C21209}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
64 64 {2F31E405-E267-4195-A05D-574093C21209}.Debug|Any CPU.Build.0 = Debug|Any CPU
65 65 {2F31E405-E267-4195-A05D-574093C21209}.Release 4.5|Any CPU.ActiveCfg = Release 4.5|Any CPU
66 66 {2F31E405-E267-4195-A05D-574093C21209}.Release 4.5|Any CPU.Build.0 = Release 4.5|Any CPU
67 67 {2F31E405-E267-4195-A05D-574093C21209}.Release|Any CPU.ActiveCfg = Release|Any CPU
68 68 {2F31E405-E267-4195-A05D-574093C21209}.Release|Any CPU.Build.0 = Release|Any CPU
69 69 {63F92C0C-61BF-48C0-A377-8D67C3C661D0}.Debug 4.5|Any CPU.ActiveCfg = Debug 4.5|Any CPU
70 70 {63F92C0C-61BF-48C0-A377-8D67C3C661D0}.Debug 4.5|Any CPU.Build.0 = Debug 4.5|Any CPU
71 71 {63F92C0C-61BF-48C0-A377-8D67C3C661D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
72 72 {63F92C0C-61BF-48C0-A377-8D67C3C661D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
73 73 {63F92C0C-61BF-48C0-A377-8D67C3C661D0}.Release 4.5|Any CPU.ActiveCfg = Release 4.5|Any CPU
74 74 {63F92C0C-61BF-48C0-A377-8D67C3C661D0}.Release 4.5|Any CPU.Build.0 = Release 4.5|Any CPU
75 75 {63F92C0C-61BF-48C0-A377-8D67C3C661D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
76 76 {63F92C0C-61BF-48C0-A377-8D67C3C661D0}.Release|Any CPU.Build.0 = Release|Any CPU
77 77 EndGlobalSection
78 78 GlobalSection(NestedProjects) = preSolution
79 79 {2BD05F84-E067-4B87-9477-FDC2676A21C6} = {BCA337C3-BFDC-4825-BBDB-E6D467E4E452}
80 80 EndGlobalSection
81 81 GlobalSection(MonoDevelopProperties) = preSolution
82 StartupItem = MonoPlay\MonoPlay.csproj
83 82 Policies = $0
84 83 $0.CSharpFormattingPolicy = $1
85 84 $1.IndentSwitchBody = True
86 85 $1.NamespaceBraceStyle = EndOfLine
87 86 $1.ClassBraceStyle = EndOfLine
88 87 $1.InterfaceBraceStyle = EndOfLine
89 88 $1.StructBraceStyle = EndOfLine
90 89 $1.EnumBraceStyle = EndOfLine
91 90 $1.MethodBraceStyle = EndOfLine
92 91 $1.ConstructorBraceStyle = EndOfLine
93 92 $1.DestructorBraceStyle = EndOfLine
94 93 $1.BeforeMethodDeclarationParentheses = False
95 94 $1.BeforeMethodCallParentheses = False
96 95 $1.BeforeConstructorDeclarationParentheses = False
97 96 $1.NewLineBeforeConstructorInitializerColon = NewLine
98 97 $1.NewLineAfterConstructorInitializerColon = SameLine
99 98 $1.BeforeIndexerDeclarationBracket = False
100 99 $1.BeforeDelegateDeclarationParentheses = False
101 100 $1.NewParentheses = False
102 101 $1.SpacesBeforeBrackets = False
103 102 $1.inheritsSet = Mono
104 103 $1.inheritsScope = text/x-csharp
105 104 $1.scope = text/x-csharp
106 105 $0.TextStylePolicy = $2
107 106 $2.FileWidth = 120
108 107 $2.EolMarker = Unix
109 108 $2.inheritsSet = VisualStudio
110 109 $2.inheritsScope = text/plain
111 110 $2.scope = text/x-csharp
112 111 $0.DotNetNamingPolicy = $3
113 112 $3.DirectoryNamespaceAssociation = PrefixedHierarchical
114 113 $3.ResourceNamePolicy = MSBuild
115 114 $0.TextStylePolicy = $4
116 115 $4.FileWidth = 120
117 116 $4.TabsToSpaces = False
118 117 $4.inheritsSet = VisualStudio
119 118 $4.inheritsScope = text/plain
120 119 $4.scope = application/xml
121 120 $0.XmlFormattingPolicy = $5
122 121 $5.inheritsSet = Mono
123 122 $5.inheritsScope = application/xml
124 123 $5.scope = application/xml
125 124 $0.TextStylePolicy = $6
126 125 $6.FileWidth = 120
127 126 $6.TabsToSpaces = False
128 127 $6.inheritsSet = VisualStudio
129 128 $6.inheritsScope = text/plain
130 129 $6.scope = text/plain
131 130 $0.NameConventionPolicy = $7
132 131 $7.Rules = $8
133 132 $8.NamingRule = $9
134 133 $9.Name = Namespaces
135 134 $9.AffectedEntity = Namespace
136 135 $9.VisibilityMask = VisibilityMask
137 136 $9.NamingStyle = PascalCase
138 137 $9.IncludeInstanceMembers = True
139 138 $9.IncludeStaticEntities = True
140 139 $8.NamingRule = $10
141 140 $10.Name = Types
142 141 $10.AffectedEntity = Class, Struct, Enum, Delegate
143 142 $10.VisibilityMask = VisibilityMask
144 143 $10.NamingStyle = PascalCase
145 144 $10.IncludeInstanceMembers = True
146 145 $10.IncludeStaticEntities = True
147 146 $8.NamingRule = $11
148 147 $11.Name = Interfaces
149 148 $11.RequiredPrefixes = $12
150 149 $12.String = I
151 150 $11.AffectedEntity = Interface
152 151 $11.VisibilityMask = VisibilityMask
153 152 $11.NamingStyle = PascalCase
154 153 $11.IncludeInstanceMembers = True
155 154 $11.IncludeStaticEntities = True
156 155 $8.NamingRule = $13
157 156 $13.Name = Attributes
158 157 $13.RequiredSuffixes = $14
159 158 $14.String = Attribute
160 159 $13.AffectedEntity = CustomAttributes
161 160 $13.VisibilityMask = VisibilityMask
162 161 $13.NamingStyle = PascalCase
163 162 $13.IncludeInstanceMembers = True
164 163 $13.IncludeStaticEntities = True
165 164 $8.NamingRule = $15
166 165 $15.Name = Event Arguments
167 166 $15.RequiredSuffixes = $16
168 167 $16.String = EventArgs
169 168 $15.AffectedEntity = CustomEventArgs
170 169 $15.VisibilityMask = VisibilityMask
171 170 $15.NamingStyle = PascalCase
172 171 $15.IncludeInstanceMembers = True
173 172 $15.IncludeStaticEntities = True
174 173 $8.NamingRule = $17
175 174 $17.Name = Exceptions
176 175 $17.RequiredSuffixes = $18
177 176 $18.String = Exception
178 177 $17.AffectedEntity = CustomExceptions
179 178 $17.VisibilityMask = VisibilityMask
180 179 $17.NamingStyle = PascalCase
181 180 $17.IncludeInstanceMembers = True
182 181 $17.IncludeStaticEntities = True
183 182 $8.NamingRule = $19
184 183 $19.Name = Methods
185 184 $19.AffectedEntity = Methods
186 185 $19.VisibilityMask = VisibilityMask
187 186 $19.NamingStyle = PascalCase
188 187 $19.IncludeInstanceMembers = True
189 188 $19.IncludeStaticEntities = True
190 189 $8.NamingRule = $20
191 190 $20.Name = Static Readonly Fields
192 191 $20.AffectedEntity = ReadonlyField
193 192 $20.VisibilityMask = Internal, Protected, Public
194 193 $20.NamingStyle = PascalCase
195 194 $20.IncludeInstanceMembers = False
196 195 $20.IncludeStaticEntities = True
197 196 $8.NamingRule = $21
198 197 $21.Name = Fields (Non Private)
199 198 $21.AffectedEntity = Field
200 199 $21.VisibilityMask = Internal, Public
201 200 $21.NamingStyle = CamelCase
202 201 $21.IncludeInstanceMembers = True
203 202 $21.IncludeStaticEntities = True
204 203 $8.NamingRule = $22
205 204 $22.Name = ReadOnly Fields (Non Private)
206 205 $22.AffectedEntity = ReadonlyField
207 206 $22.VisibilityMask = Internal, Public
208 207 $22.NamingStyle = CamelCase
209 208 $22.IncludeInstanceMembers = True
210 209 $22.IncludeStaticEntities = False
211 210 $8.NamingRule = $23
212 211 $23.Name = Fields (Private)
213 212 $23.RequiredPrefixes = $24
214 213 $24.String = m_
215 214 $23.AffectedEntity = Field, ReadonlyField
216 215 $23.VisibilityMask = Private, Protected
217 216 $23.NamingStyle = CamelCase
218 217 $23.IncludeInstanceMembers = True
219 218 $23.IncludeStaticEntities = False
220 219 $8.NamingRule = $25
221 220 $25.Name = Static Fields (Private)
222 221 $25.RequiredPrefixes = $26
223 222 $26.String = _
224 223 $25.AffectedEntity = Field
225 224 $25.VisibilityMask = Private
226 225 $25.NamingStyle = CamelCase
227 226 $25.IncludeInstanceMembers = False
228 227 $25.IncludeStaticEntities = True
229 228 $8.NamingRule = $27
230 229 $27.Name = ReadOnly Fields (Private)
231 230 $27.RequiredPrefixes = $28
232 231 $28.String = m_
233 232 $27.AffectedEntity = ReadonlyField
234 233 $27.VisibilityMask = Private, Protected
235 234 $27.NamingStyle = CamelCase
236 235 $27.IncludeInstanceMembers = True
237 236 $27.IncludeStaticEntities = False
238 237 $8.NamingRule = $29
239 238 $29.Name = Constant Fields
240 239 $29.AffectedEntity = ConstantField
241 240 $29.VisibilityMask = VisibilityMask
242 241 $29.NamingStyle = AllUpper
243 242 $29.IncludeInstanceMembers = True
244 243 $29.IncludeStaticEntities = True
245 244 $8.NamingRule = $30
246 245 $30.Name = Properties
247 246 $30.AffectedEntity = Property
248 247 $30.VisibilityMask = VisibilityMask
249 248 $30.NamingStyle = PascalCase
250 249 $30.IncludeInstanceMembers = True
251 250 $30.IncludeStaticEntities = True
252 251 $8.NamingRule = $31
253 252 $31.Name = Events
254 253 $31.AffectedEntity = Event
255 254 $31.VisibilityMask = VisibilityMask
256 255 $31.NamingStyle = PascalCase
257 256 $31.IncludeInstanceMembers = True
258 257 $31.IncludeStaticEntities = True
259 258 $8.NamingRule = $32
260 259 $32.Name = Enum Members
261 260 $32.AffectedEntity = EnumMember
262 261 $32.VisibilityMask = VisibilityMask
263 262 $32.NamingStyle = PascalCase
264 263 $32.IncludeInstanceMembers = True
265 264 $32.IncludeStaticEntities = True
266 265 $8.NamingRule = $33
267 266 $33.Name = Parameters
268 267 $33.AffectedEntity = Parameter, LocalVariable
269 268 $33.VisibilityMask = VisibilityMask
270 269 $33.NamingStyle = CamelCase
271 270 $33.IncludeInstanceMembers = True
272 271 $33.IncludeStaticEntities = True
273 272 $8.NamingRule = $34
274 273 $34.Name = Type Parameters
275 274 $34.RequiredPrefixes = $35
276 275 $35.String = T
277 276 $34.AffectedEntity = TypeParameter
278 277 $34.VisibilityMask = VisibilityMask
279 278 $34.NamingStyle = PascalCase
280 279 $34.IncludeInstanceMembers = True
281 280 $34.IncludeStaticEntities = True
281 version = 0.2
282 StartupItem = MonoPlay\MonoPlay.csproj
282 283 EndGlobalSection
283 284 GlobalSection(TestCaseManagementSettings) = postSolution
284 285 CategoryFile = Implab.vsmdi
285 286 EndGlobalSection
286 287 GlobalSection(SolutionProperties) = preSolution
287 288 HideSolutionNode = FALSE
288 289 EndGlobalSection
289 290 EndGlobal
@@ -1,106 +1,66
1 1 using System;
2 2 using System.Collections.Generic;
3 3 using System.Linq;
4 4 using System.Text;
5 5
6 6 namespace Implab {
7 7 public interface IPromise: ICancellable {
8 8
9 9 /// <summary>
10 10 /// Π’ΠΈΠΏ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‡Π΅Ρ€Π΅Π· Π΄Π°Π½Π½ΠΎΠ΅ ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅.
11 11 /// </summary>
12 12 Type PromiseType { get; }
13 13
14 14 /// <summary>
15 15 /// ΠžΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅ являСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ΠΌ, Π»ΠΈΠ±ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Π»ΠΈΠ±ΠΎ с ошибкой, Π»ΠΈΠ±ΠΎ ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½ΠΎ.
16 16 /// </summary>
17 17 bool IsResolved { get; }
18 18
19 19 /// <summary>
20 20 /// ΠžΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½ΠΎ.
21 21 /// </summary>
22 22 bool IsCancelled { get; }
23 23
24 24 /// <summary>
25 25 /// Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ возникшСС Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния обСщания, Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° ΠΎΡ‚ΠΌΠ΅Π½Ρ‹.
26 26 /// </summary>
27 27 Exception Error { get; }
28 28
29 29 /// <summary>
30 /// Creates a new promise dependend on the current one and resolved on
31 /// executing the specified handlers.
32 /// </summary>
33 /// <param name="success">The handler called on the successful promise completion.</param>
34 /// <param name="error">The handler is called if an error while completing the promise occurred.</param>
35 /// <param name="cancel">The handler is called in case of promise cancellation.</param>
36 /// <returns>The newly created dependant promise.</returns>
37 /// <remarks>
38 /// <para>
39 /// If the success handler is specified the dependend promise will be resolved after the handler is
40 /// executed and the dependent promise will be linked to the current one, i.e. the cancellation
41 /// of the dependent property will lead to the cancellation of the current promise. If the
42 /// success handler isn't specified the dependent promise will not be linked to and
43 /// will not be resolved after the successfull resolution of the current one.
44 /// </para>
45 /// <para>
46 /// When the error handler is specified, the exception raised during the current promise completion
47 /// will be passed to it as the parameter. If the error handler returns without raising an
48 /// exception then the dependant promise will be resolved successfully, otherwise the exception
49 /// raised by the handler will be transmitted to the dependent promise. If the handler wants
50 /// to passthrough the original exception it needs to wrap the exception with
51 /// the <see cref="PromiseTransientException"/>. The handler may raise <see cref="OperationCanceledException"/>
52 /// to cancel the dependant promise, the innner exception specifies the reason why the promise
53 /// is canceled.
54 /// </para>
55 /// <para>
56 /// If the cancelation handler is specified and the current promise is cancelled then the dependent
57 /// promise will be resolved after the handler is executed. If the cancelation handler raises the
58 /// exception it will be passed to the dependent promise.
59 /// </para>
60 /// </remarks>
61 /* IPromise Then(Action success, Action<Exception> error, Action<Exception> cancel);
62 IPromise Then(Action success, Action<Exception> error);
63 IPromise Then(Action success);
64
65 IPromise Chain(Func<IPromise> chained, Func<Exception, IPromise> error, Func<Exception, IPromise> cancel);
66 IPromise Chain(Func<IPromise> chained, Func<Exception, IPromise> error);
67 IPromise Chain(Func<IPromise> chained);*/
68
69 /// <summary>
70 30 /// Adds specified listeners to the current promise.
71 31 /// </summary>
72 32 /// <param name="success">The handler called on the successful promise completion.</param>
73 33 /// <param name="error">The handler is called if an error while completing the promise occurred.</param>
74 34 /// <param name="cancel">The handler is called in case of promise cancellation.</param>
75 35 /// <returns>The current promise.</returns>
76 36 IPromise On(Action success, Action<Exception> error, Action<Exception> cancel);
77 37 IPromise On(Action success, Action<Exception> error);
78 38 IPromise On(Action success);
79 39
80 40 /// <summary>
81 41 /// Adds specified listeners to the current promise.
82 42 /// </summary>
83 43 /// <param name="handler">The handler called on the specified events.</param>
84 44 /// <param name = "events">The combination of flags denoting the events for which the
85 45 /// handler shoud be called.</param>
86 46 /// <returns>The current promise.</returns>
87 47 IPromise On(Action handler, PromiseEventType events);
88 48
89 49 /// <summary>
90 50 /// ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ обСщания ΠΊ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅.
91 51 /// </summary>
92 52 IPromise<T> Cast<T>();
93 53
94 54 /// <summary>
95 55 /// Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ с ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅ΠΌ.
96 56 /// </summary>
97 57 void Join();
98 58 /// <summary>
99 59 /// Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ с ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅ΠΌ.
100 60 /// </summary>
101 61 /// <param name="timeout">ВрСмя оТидания, ΠΏΠΎ Π΅Π³ΠΎ ΠΈΡΡ‚Π΅Ρ‡Π΅Π½ΠΈΡŽ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.</param>
102 62 /// <exception cref="TimeoutException">ΠŸΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΎ врСмя оТидания.</exception>
103 63 void Join(int timeout);
104 64
105 65 }
106 66 }
@@ -1,248 +1,255
1 1 ο»Ώ<?xml version="1.0" encoding="utf-8"?>
2 2 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 3 <PropertyGroup>
4 4 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5 5 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6 6 <ProjectGuid>{F550F1F8-8746-4AD0-9614-855F4C4B7F05}</ProjectGuid>
7 7 <OutputType>Library</OutputType>
8 8 <RootNamespace>Implab</RootNamespace>
9 9 <AssemblyName>Implab</AssemblyName>
10 <ProductVersion>8.0.30703</ProductVersion>
11 <SchemaVersion>2.0</SchemaVersion>
12 <ReleaseVersion>0.2</ReleaseVersion>
13 <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
10 14 </PropertyGroup>
11 15 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
12 16 <DebugSymbols>true</DebugSymbols>
13 17 <DebugType>full</DebugType>
14 18 <Optimize>false</Optimize>
15 19 <OutputPath>bin\Debug</OutputPath>
16 20 <DefineConstants>TRACE;DEBUG;</DefineConstants>
17 21 <ErrorReport>prompt</ErrorReport>
18 22 <WarningLevel>4</WarningLevel>
19 23 <ConsolePause>false</ConsolePause>
20 24 <RunCodeAnalysis>true</RunCodeAnalysis>
21 25 </PropertyGroup>
22 26 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
23 27 <DebugType>full</DebugType>
24 28 <Optimize>true</Optimize>
25 29 <OutputPath>bin\Release</OutputPath>
26 30 <ErrorReport>prompt</ErrorReport>
27 31 <WarningLevel>4</WarningLevel>
28 32 <ConsolePause>false</ConsolePause>
29 33 </PropertyGroup>
30 34 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug 4.5|AnyCPU' ">
31 35 <DebugSymbols>true</DebugSymbols>
32 36 <DebugType>full</DebugType>
33 37 <Optimize>false</Optimize>
34 38 <OutputPath>bin\Debug</OutputPath>
35 39 <DefineConstants>TRACE;DEBUG;NET_4_5</DefineConstants>
36 40 <ErrorReport>prompt</ErrorReport>
37 41 <WarningLevel>4</WarningLevel>
38 42 <RunCodeAnalysis>true</RunCodeAnalysis>
39 43 <ConsolePause>false</ConsolePause>
40 44 </PropertyGroup>
41 45 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release 4.5|AnyCPU' ">
42 46 <Optimize>true</Optimize>
43 47 <OutputPath>bin\Release</OutputPath>
44 48 <ErrorReport>prompt</ErrorReport>
45 49 <WarningLevel>4</WarningLevel>
46 50 <ConsolePause>false</ConsolePause>
47 51 <DefineConstants>NET_4_5</DefineConstants>
48 52 </PropertyGroup>
49 53 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU' ">
50 54 <DebugSymbols>true</DebugSymbols>
51 55 <DebugType>full</DebugType>
52 56 <Optimize>false</Optimize>
53 57 <OutputPath>bin\Debug</OutputPath>
54 58 <DefineConstants>TRACE;DEBUG;NET_4_5;MONO</DefineConstants>
55 59 <ErrorReport>prompt</ErrorReport>
56 60 <WarningLevel>4</WarningLevel>
57 61 <RunCodeAnalysis>true</RunCodeAnalysis>
58 62 <ConsolePause>false</ConsolePause>
59 63 </PropertyGroup>
60 64 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU' ">
61 65 <Optimize>true</Optimize>
62 66 <OutputPath>bin\Release</OutputPath>
63 67 <DefineConstants>NET_4_5;MONO;</DefineConstants>
64 68 <ErrorReport>prompt</ErrorReport>
65 69 <WarningLevel>4</WarningLevel>
66 70 <ConsolePause>false</ConsolePause>
67 71 </PropertyGroup>
68 72 <ItemGroup>
69 73 <Reference Include="System" />
70 74 <Reference Include="System.Xml" />
75 <Reference Include="mscorlib" />
71 76 </ItemGroup>
72 77 <ItemGroup>
73 78 <Compile Include="Component.cs" />
74 79 <Compile Include="CustomEqualityComparer.cs" />
75 80 <Compile Include="Diagnostics\ConsoleTraceListener.cs" />
76 81 <Compile Include="Diagnostics\EventText.cs" />
77 82 <Compile Include="Diagnostics\LogChannel.cs" />
78 83 <Compile Include="Diagnostics\LogicalOperation.cs" />
79 84 <Compile Include="Diagnostics\TextFileListener.cs" />
80 85 <Compile Include="Diagnostics\TraceLog.cs" />
81 86 <Compile Include="Diagnostics\TraceEvent.cs" />
82 87 <Compile Include="Diagnostics\TraceEventType.cs" />
83 88 <Compile Include="Disposable.cs" />
84 89 <Compile Include="ICancellable.cs" />
85 90 <Compile Include="IProgressHandler.cs" />
86 91 <Compile Include="IProgressNotifier.cs" />
87 92 <Compile Include="IPromiseT.cs" />
88 93 <Compile Include="IPromise.cs" />
89 94 <Compile Include="IServiceLocator.cs" />
90 95 <Compile Include="ITaskController.cs" />
91 96 <Compile Include="JSON\JSONElementContext.cs" />
92 97 <Compile Include="JSON\JSONElementType.cs" />
93 98 <Compile Include="JSON\JSONGrammar.cs" />
94 99 <Compile Include="JSON\JSONParser.cs" />
95 100 <Compile Include="JSON\JSONScanner.cs" />
96 101 <Compile Include="JSON\JsonTokenType.cs" />
97 102 <Compile Include="JSON\JSONWriter.cs" />
98 103 <Compile Include="JSON\JSONXmlReader.cs" />
99 104 <Compile Include="JSON\JSONXmlReaderOptions.cs" />
100 105 <Compile Include="JSON\StringTranslator.cs" />
101 106 <Compile Include="Parallels\DispatchPool.cs" />
102 107 <Compile Include="Parallels\ArrayTraits.cs" />
103 108 <Compile Include="Parallels\MTQueue.cs" />
104 109 <Compile Include="Parallels\WorkerPool.cs" />
105 110 <Compile Include="Parsing\Alphabet.cs" />
106 111 <Compile Include="Parsing\AlphabetBase.cs" />
107 112 <Compile Include="Parsing\AltToken.cs" />
108 113 <Compile Include="Parsing\BinaryToken.cs" />
109 114 <Compile Include="Parsing\CatToken.cs" />
110 115 <Compile Include="Parsing\CDFADefinition.cs" />
111 116 <Compile Include="Parsing\DFABuilder.cs" />
112 117 <Compile Include="Parsing\DFADefinitionBase.cs" />
113 118 <Compile Include="Parsing\DFAStateDescriptor.cs" />
114 119 <Compile Include="Parsing\DFAutomaton.cs" />
115 120 <Compile Include="Parsing\EDFADefinition.cs" />
116 121 <Compile Include="Parsing\EmptyToken.cs" />
117 122 <Compile Include="Parsing\EndToken.cs" />
118 123 <Compile Include="Parsing\EnumAlphabet.cs" />
119 124 <Compile Include="Parsing\Grammar.cs" />
120 125 <Compile Include="Parsing\IAlphabet.cs" />
121 126 <Compile Include="Parsing\IDFADefinition.cs" />
122 127 <Compile Include="Parsing\IVisitor.cs" />
123 128 <Compile Include="Parsing\ParserException.cs" />
124 129 <Compile Include="Parsing\Scanner.cs" />
125 130 <Compile Include="Parsing\StarToken.cs" />
126 131 <Compile Include="Parsing\SymbolToken.cs" />
127 132 <Compile Include="Parsing\Token.cs" />
128 133 <Compile Include="ServiceLocator.cs" />
129 134 <Compile Include="TaskController.cs" />
130 135 <Compile Include="ProgressInitEventArgs.cs" />
131 136 <Compile Include="Properties\AssemblyInfo.cs" />
132 137 <Compile Include="Parallels\AsyncPool.cs" />
133 138 <Compile Include="Safe.cs" />
134 139 <Compile Include="ValueEventArgs.cs" />
135 140 <Compile Include="PromiseExtensions.cs" />
136 141 <Compile Include="SyncContextPromise.cs" />
137 142 <Compile Include="Diagnostics\OperationContext.cs" />
138 143 <Compile Include="Diagnostics\TraceContext.cs" />
139 144 <Compile Include="Diagnostics\LogEventArgs.cs" />
140 145 <Compile Include="Diagnostics\LogEventArgsT.cs" />
141 146 <Compile Include="Diagnostics\Extensions.cs" />
142 147 <Compile Include="IComponentContainer.cs" />
143 148 <Compile Include="PromiseEventType.cs" />
144 149 <Compile Include="ComponentContainer.cs" />
145 150 <Compile Include="DisposablePool.cs" />
146 151 <Compile Include="ObjectPool.cs" />
147 152 <Compile Include="Parallels\AsyncQueue.cs" />
148 153 <Compile Include="PromiseT.cs" />
149 154 <Compile Include="IDeferred.cs" />
150 155 <Compile Include="IDeferredT.cs" />
151 156 <Compile Include="Promise.cs" />
152 157 <Compile Include="PromiseTransientException.cs" />
153 158 <Compile Include="Parallels\Signal.cs" />
154 159 <Compile Include="Parallels\SharedLock.cs" />
155 160 <Compile Include="Diagnostics\ILogWriter.cs" />
156 161 <Compile Include="Diagnostics\ListenerBase.cs" />
157 162 <Compile Include="Parallels\BlockingQueue.cs" />
158 163 <Compile Include="AbstractEvent.cs" />
159 164 <Compile Include="AbstractPromise.cs" />
160 165 <Compile Include="AbstractPromiseT.cs" />
161 166 <Compile Include="FuncTask.cs" />
162 167 <Compile Include="FuncTaskBase.cs" />
163 168 <Compile Include="FuncTaskT.cs" />
164 169 <Compile Include="ActionChainTaskBase.cs" />
165 170 <Compile Include="ActionChainTask.cs" />
166 171 <Compile Include="ActionChainTaskT.cs" />
167 172 <Compile Include="FuncChainTaskBase.cs" />
168 173 <Compile Include="FuncChainTask.cs" />
169 174 <Compile Include="FuncChainTaskT.cs" />
170 175 <Compile Include="ActionTaskBase.cs" />
171 176 <Compile Include="ActionTask.cs" />
172 177 <Compile Include="ActionTaskT.cs" />
173 178 <Compile Include="ICancellationToken.cs" />
174 179 <Compile Include="SuccessPromise.cs" />
175 180 <Compile Include="SuccessPromiseT.cs" />
181 <Compile Include="PromiseAwaiterT.cs" />
182 <Compile Include="PromiseAwaiter.cs" />
176 183 </ItemGroup>
177 184 <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
178 185 <ItemGroup />
179 186 <ProjectExtensions>
180 187 <MonoDevelop>
181 188 <Properties>
182 189 <Policies>
183 190 <CSharpFormattingPolicy IndentSwitchBody="True" NamespaceBraceStyle="EndOfLine" ClassBraceStyle="EndOfLine" InterfaceBraceStyle="EndOfLine" StructBraceStyle="EndOfLine" EnumBraceStyle="EndOfLine" MethodBraceStyle="EndOfLine" ConstructorBraceStyle="EndOfLine" DestructorBraceStyle="EndOfLine" BeforeMethodDeclarationParentheses="False" BeforeMethodCallParentheses="False" BeforeConstructorDeclarationParentheses="False" NewLineBeforeConstructorInitializerColon="NewLine" NewLineAfterConstructorInitializerColon="SameLine" BeforeIndexerDeclarationBracket="False" BeforeDelegateDeclarationParentheses="False" NewParentheses="False" SpacesBeforeBrackets="False" inheritsSet="Mono" inheritsScope="text/x-csharp" scope="text/x-csharp" />
184 191 <TextStylePolicy FileWidth="120" EolMarker="Unix" inheritsSet="VisualStudio" inheritsScope="text/plain" scope="text/x-csharp" />
185 192 <DotNetNamingPolicy DirectoryNamespaceAssociation="PrefixedHierarchical" ResourceNamePolicy="MSBuild" />
186 193 <TextStylePolicy FileWidth="120" TabsToSpaces="False" inheritsSet="VisualStudio" inheritsScope="text/plain" scope="application/xml" />
187 194 <XmlFormattingPolicy inheritsSet="Mono" inheritsScope="application/xml" scope="application/xml" />
188 195 <TextStylePolicy FileWidth="120" TabsToSpaces="False" inheritsSet="VisualStudio" inheritsScope="text/plain" scope="text/plain" />
189 196 <NameConventionPolicy>
190 197 <Rules>
191 198 <NamingRule Name="Namespaces" AffectedEntity="Namespace" VisibilityMask="VisibilityMask" NamingStyle="PascalCase" IncludeInstanceMembers="True" IncludeStaticEntities="True" />
192 199 <NamingRule Name="Types" AffectedEntity="Class, Struct, Enum, Delegate" VisibilityMask="VisibilityMask" NamingStyle="PascalCase" IncludeInstanceMembers="True" IncludeStaticEntities="True" />
193 200 <NamingRule Name="Interfaces" AffectedEntity="Interface" VisibilityMask="VisibilityMask" NamingStyle="PascalCase" IncludeInstanceMembers="True" IncludeStaticEntities="True">
194 201 <RequiredPrefixes>
195 202 <String>I</String>
196 203 </RequiredPrefixes>
197 204 </NamingRule>
198 205 <NamingRule Name="Attributes" AffectedEntity="CustomAttributes" VisibilityMask="VisibilityMask" NamingStyle="PascalCase" IncludeInstanceMembers="True" IncludeStaticEntities="True">
199 206 <RequiredSuffixes>
200 207 <String>Attribute</String>
201 208 </RequiredSuffixes>
202 209 </NamingRule>
203 210 <NamingRule Name="Event Arguments" AffectedEntity="CustomEventArgs" VisibilityMask="VisibilityMask" NamingStyle="PascalCase" IncludeInstanceMembers="True" IncludeStaticEntities="True">
204 211 <RequiredSuffixes>
205 212 <String>EventArgs</String>
206 213 </RequiredSuffixes>
207 214 </NamingRule>
208 215 <NamingRule Name="Exceptions" AffectedEntity="CustomExceptions" VisibilityMask="VisibilityMask" NamingStyle="PascalCase" IncludeInstanceMembers="True" IncludeStaticEntities="True">
209 216 <RequiredSuffixes>
210 217 <String>Exception</String>
211 218 </RequiredSuffixes>
212 219 </NamingRule>
213 220 <NamingRule Name="Methods" AffectedEntity="Methods" VisibilityMask="VisibilityMask" NamingStyle="PascalCase" IncludeInstanceMembers="True" IncludeStaticEntities="True" />
214 221 <NamingRule Name="Static Readonly Fields" AffectedEntity="ReadonlyField" VisibilityMask="Internal, Protected, Public" NamingStyle="CamelCase" IncludeInstanceMembers="False" IncludeStaticEntities="True" />
215 222 <NamingRule Name="Fields (Non Private)" AffectedEntity="Field" VisibilityMask="Internal, Public" NamingStyle="CamelCase" IncludeInstanceMembers="True" IncludeStaticEntities="True" />
216 223 <NamingRule Name="ReadOnly Fields (Non Private)" AffectedEntity="ReadonlyField" VisibilityMask="Internal, Public" NamingStyle="CamelCase" IncludeInstanceMembers="True" IncludeStaticEntities="False" />
217 224 <NamingRule Name="Fields (Private)" AffectedEntity="Field, ReadonlyField" VisibilityMask="Private, Protected" NamingStyle="CamelCase" IncludeInstanceMembers="True" IncludeStaticEntities="False">
218 225 <RequiredPrefixes>
219 226 <String>m_</String>
220 227 </RequiredPrefixes>
221 228 </NamingRule>
222 229 <NamingRule Name="Static Fields (Private)" AffectedEntity="Field" VisibilityMask="Private" NamingStyle="CamelCase" IncludeInstanceMembers="False" IncludeStaticEntities="True">
223 230 <RequiredPrefixes>
224 231 <String>_</String>
225 232 </RequiredPrefixes>
226 233 </NamingRule>
227 234 <NamingRule Name="ReadOnly Fields (Private)" AffectedEntity="ReadonlyField" VisibilityMask="Private, Protected" NamingStyle="CamelCase" IncludeInstanceMembers="True" IncludeStaticEntities="False">
228 235 <RequiredPrefixes>
229 236 <String>m_</String>
230 237 </RequiredPrefixes>
231 238 </NamingRule>
232 239 <NamingRule Name="Constant Fields" AffectedEntity="ConstantField" VisibilityMask="VisibilityMask" NamingStyle="AllUpper" IncludeInstanceMembers="True" IncludeStaticEntities="True" />
233 240 <NamingRule Name="Properties" AffectedEntity="Property" VisibilityMask="VisibilityMask" NamingStyle="PascalCase" IncludeInstanceMembers="True" IncludeStaticEntities="True" />
234 241 <NamingRule Name="Events" AffectedEntity="Event" VisibilityMask="VisibilityMask" NamingStyle="PascalCase" IncludeInstanceMembers="True" IncludeStaticEntities="True" />
235 242 <NamingRule Name="Enum Members" AffectedEntity="EnumMember" VisibilityMask="VisibilityMask" NamingStyle="PascalCase" IncludeInstanceMembers="True" IncludeStaticEntities="True" />
236 243 <NamingRule Name="Parameters" AffectedEntity="Parameter, LocalVariable" VisibilityMask="VisibilityMask" NamingStyle="CamelCase" IncludeInstanceMembers="True" IncludeStaticEntities="True" />
237 244 <NamingRule Name="Type Parameters" AffectedEntity="TypeParameter" VisibilityMask="VisibilityMask" NamingStyle="PascalCase" IncludeInstanceMembers="True" IncludeStaticEntities="True">
238 245 <RequiredPrefixes>
239 246 <String>T</String>
240 247 </RequiredPrefixes>
241 248 </NamingRule>
242 249 </Rules>
243 250 </NameConventionPolicy>
244 251 </Policies>
245 252 </Properties>
246 253 </MonoDevelop>
247 254 </ProjectExtensions>
248 255 </Project> No newline at end of file
@@ -1,302 +1,299
1 1 using System.Threading;
2 2 using System;
3 3 using Implab.Diagnostics;
4 4 using System.Collections.Generic;
5 5
6 6
7 7 #if NET_4_5
8 8 using System.Threading.Tasks;
9 9 #endif
10 10
11 11 namespace Implab {
12 12 public static class PromiseExtensions {
13 13 public static IPromise<T> DispatchToCurrentContext<T>(this IPromise<T> that) {
14 14 Safe.ArgumentNotNull(that, "that");
15 15 var context = SynchronizationContext.Current;
16 16 if (context == null)
17 17 return that;
18 18
19 19 var p = new SyncContextPromise<T>(context);
20 20 p.On(that.Cancel, PromiseEventType.Cancelled);
21 21
22 22 that.On(
23 23 p.Resolve,
24 24 p.Reject,
25 25 p.Cancel
26 26 );
27 27 return p;
28 28 }
29 29
30 30 public static IPromise<T> DispatchToContext<T>(this IPromise<T> that, SynchronizationContext context) {
31 31 Safe.ArgumentNotNull(that, "that");
32 32 Safe.ArgumentNotNull(context, "context");
33 33
34 34 var p = new SyncContextPromise<T>(context);
35 35 p.On(that.Cancel, PromiseEventType.Cancelled);
36 36
37 37
38 38 that.On(
39 39 p.Resolve,
40 40 p.Reject,
41 41 p.Cancel
42 42 );
43 43 return p;
44 44 }
45 45
46 46 /// <summary>
47 47 /// Ensures the dispatched.
48 48 /// </summary>
49 49 /// <returns>The dispatched.</returns>
50 50 /// <param name="that">That.</param>
51 51 /// <param name="head">Head.</param>
52 52 /// <param name="cleanup">Cleanup.</param>
53 53 /// <typeparam name="TPromise">The 1st type parameter.</typeparam>
54 54 /// <typeparam name="T">The 2nd type parameter.</typeparam>
55 55 public static TPromise EnsureDispatched<TPromise,T>(this TPromise that, IPromise<T> head, Action<T> cleanup) where TPromise : IPromise{
56 56 Safe.ArgumentNotNull(that, "that");
57 57 Safe.ArgumentNotNull(head, "head");
58 58
59 59 that.On(() => head.On(cleanup), PromiseEventType.Cancelled);
60 60
61 61 return that;
62 62 }
63 63
64 64 public static AsyncCallback AsyncCallback<T>(this Promise<T> that, Func<IAsyncResult,T> callback) {
65 65 Safe.ArgumentNotNull(that, "that");
66 66 Safe.ArgumentNotNull(callback, "callback");
67 67 var op = TraceContext.Instance.CurrentOperation;
68 68 return ar => {
69 69 TraceContext.Instance.EnterLogicalOperation(op,false);
70 70 try {
71 71 that.Resolve(callback(ar));
72 72 } catch (Exception err) {
73 73 that.Reject(err);
74 74 } finally {
75 75 TraceContext.Instance.Leave();
76 76 }
77 77 };
78 78 }
79 79
80 80 static void CancelCallback(object cookie) {
81 81 ((ICancellable)cookie).Cancel();
82 82 }
83 83
84 84 /// <summary>
85 85 /// Cancells promise after the specified timeout is elapsed.
86 86 /// </summary>
87 87 /// <param name="that">The promise to cancel on timeout.</param>
88 88 /// <param name="milliseconds">The timeout in milliseconds.</param>
89 89 /// <typeparam name="TPromise">The 1st type parameter.</typeparam>
90 90 public static TPromise Timeout<TPromise>(this TPromise that, int milliseconds) where TPromise : IPromise {
91 91 Safe.ArgumentNotNull(that, "that");
92 92 var timer = new Timer(CancelCallback, that, milliseconds, -1);
93 93 that.On(timer.Dispose, PromiseEventType.All);
94 94 return that;
95 95 }
96 96
97 97 public static IPromise Bundle(this ICollection<IPromise> that) {
98 98 Safe.ArgumentNotNull(that, "that");
99 99
100 100 int count = that.Count;
101 101 int errors = 0;
102 102 var medium = new Promise();
103 103
104 104 if (count == 0) {
105 105 medium.Resolve();
106 106 return medium;
107 107 }
108 108
109 109 medium.On(() => {
110 110 foreach(var p2 in that)
111 111 p2.Cancel();
112 112 }, PromiseEventType.ErrorOrCancel);
113 113
114 114 foreach (var p in that)
115 115 p.On(
116 116 () => {
117 117 if (Interlocked.Decrement(ref count) == 0)
118 118 medium.Resolve();
119 119 },
120 120 error => {
121 121 if (Interlocked.Increment(ref errors) == 1)
122 122 medium.Reject(
123 123 new Exception("The dependency promise is failed", error)
124 124 );
125 125 },
126 126 reason => {
127 127 if (Interlocked.Increment(ref errors) == 1)
128 128 medium.Cancel(
129 129 new Exception("The dependency promise is cancelled")
130 130 );
131 131 }
132 132 );
133 133
134 134 return medium;
135 135 }
136 136
137 137 public static IPromise<T[]> Bundle<T>(this ICollection<IPromise<T>> that) {
138 138 Safe.ArgumentNotNull(that, "that");
139 139
140 140 int count = that.Count;
141 141 int errors = 0;
142 142 var medium = new Promise<T[]>();
143 143 var results = new T[that.Count];
144 144
145 145 medium.On(() => {
146 146 foreach(var p2 in that)
147 147 p2.Cancel();
148 148 }, PromiseEventType.ErrorOrCancel);
149 149
150 150 int i = 0;
151 151 foreach (var p in that) {
152 152 var idx = i;
153 153 p.On(
154 154 x => {
155 155 results[idx] = x;
156 156 if (Interlocked.Decrement(ref count) == 0)
157 157 medium.Resolve(results);
158 158 },
159 159 error => {
160 160 if (Interlocked.Increment(ref errors) == 1)
161 161 medium.Reject(
162 162 new Exception("The dependency promise is failed", error)
163 163 );
164 164 },
165 165 reason => {
166 166 if (Interlocked.Increment(ref errors) == 1)
167 167 medium.Cancel(
168 168 new Exception("The dependency promise is cancelled", reason)
169 169 );
170 170 }
171 171 );
172 172 i++;
173 173 }
174 174
175 175 return medium;
176 176 }
177 177
178 178 public static IPromise Then(this IPromise that, Action success, Action<Exception> error, Action<Exception> cancel) {
179 179 Safe.ArgumentNotNull(that, "that");
180 180
181 181 var d = new ActionTask(success, error, cancel, false);
182 182 that.On(d.Resolve, d.Reject, d.CancelOperation);
183 183 if (success != null)
184 184 d.CancellationRequested(that.Cancel);
185 185 return d;
186 186 }
187 187
188 188 public static IPromise Then(this IPromise that, Action success, Action<Exception> error) {
189 189 return Then(that, success, error, null);
190 190 }
191 191
192 192 public static IPromise Then(this IPromise that, Action success) {
193 193 return Then(that, success, null, null);
194 194 }
195 195
196 196 public static IPromise<T> Then<T>(this IPromise that, Func<T> success, Func<Exception, T> error, Func<Exception, T> cancel) {
197 197 Safe.ArgumentNotNull(that, "that");
198 198
199 199 var d = new FuncTask<T>(success, error, cancel, false);
200 200 that.On(d.Resolve, d.Reject, d.CancelOperation);
201 201 if (success != null)
202 202 d.CancellationRequested(that.Cancel);
203 203 return d;
204 204 }
205 205
206 206 public static IPromise<T> Then<T>(this IPromise that, Func<T> success, Func<Exception, T> error) {
207 207 return Then(that, success, error, null);
208 208 }
209 209
210 210 public static IPromise<T> Then<T>(this IPromise that, Func<T> success) {
211 211 return Then(that, success, null, null);
212 212 }
213 213
214 214 public static IPromise<T2> Then<T, T2>(this IPromise<T> that, Func<T, T2> success, Func<Exception, T2> error, Func<Exception, T2> cancel) {
215 215 Safe.ArgumentNotNull(that, "that");
216 216 var d = new FuncTask<T,T2>(success, error, cancel, false);
217 217 that.On(d.Resolve, d.Reject, d.CancelOperation);
218 218 if (success != null)
219 219 d.CancellationRequested(that.Cancel);
220 220 return d;
221 221 }
222 222
223 223 public static IPromise<T2> Then<T, T2>(this IPromise<T> that, Func<T, T2> success, Func<Exception, T2> error) {
224 224 return Then(that, success, error, null);
225 225 }
226 226
227 227 public static IPromise<T2> Then<T, T2>(this IPromise<T> that, Func<T, T2> success) {
228 228 return Then(that, success, null, null);
229 229 }
230 230
231 231 #region chain traits
232 232 public static IPromise Chain(this IPromise that, Func<IPromise> success, Func<Exception,IPromise> error, Func<Exception,IPromise> cancel) {
233 233 Safe.ArgumentNotNull(that, "that");
234 234
235 235 var d = new ActionChainTask(success, error, cancel, false);
236 236 that.On(d.Resolve, d.Reject, d.CancelOperation);
237 237 if (success != null)
238 238 d.CancellationRequested(that.Cancel);
239 239 return d;
240 240 }
241 241
242 242 public static IPromise Chain(this IPromise that, Func<IPromise> success, Func<Exception,IPromise> error) {
243 243 return Chain(that, success, error, null);
244 244 }
245 245
246 246 public static IPromise Chain(this IPromise that, Func<IPromise> success) {
247 247 return Chain(that, success, null, null);
248 248 }
249 249
250 250 public static IPromise<T> Chain<T>(this IPromise that, Func<IPromise<T>> success, Func<Exception, IPromise<T>> error, Func<Exception, IPromise<T>> cancel) {
251 251 Safe.ArgumentNotNull(that, "that");
252 252
253 253 var d = new FuncChainTask<T>(success, error, cancel, false);
254 254 that.On(d.Resolve, d.Reject, d.CancelOperation);
255 255 if (success != null)
256 256 d.CancellationRequested(that.Cancel);
257 257 return d;
258 258 }
259 259
260 260 public static IPromise<T> Chain<T>(this IPromise that, Func<IPromise<T>> success, Func<Exception, IPromise<T>> error) {
261 261 return Chain(that, success, error, null);
262 262 }
263 263
264 264 public static IPromise<T> Chain<T>(this IPromise that, Func<IPromise<T>> success) {
265 265 return Chain(that, success, null, null);
266 266 }
267 267
268 268 public static IPromise<T2> Chain<T, T2>(this IPromise<T> that, Func<T, IPromise<T2>> success, Func<Exception, IPromise<T2>> error, Func<Exception, IPromise<T2>> cancel) {
269 269 Safe.ArgumentNotNull(that, "that");
270 270 var d = new FuncChainTask<T,T2>(success, error, cancel, false);
271 271 that.On(d.Resolve, d.Reject, d.CancelOperation);
272 272 if (success != null)
273 273 d.CancellationRequested(that.Cancel);
274 274 return d;
275 275 }
276 276
277 277 public static IPromise<T2> Chain<T, T2>(this IPromise<T> that, Func<T, IPromise<T2>> success, Func<Exception, IPromise<T2>> error) {
278 278 return Chain(that, success, error, null);
279 279 }
280 280
281 281 public static IPromise<T2> Chain<T, T2>(this IPromise<T> that, Func<T, IPromise<T2>> success) {
282 282 return Chain(that, success, null, null);
283 283 }
284 284
285 285 #endregion
286 286
287 287
288 288 #if NET_4_5
289 289
290 public static Task<T> GetTask<T>(this IPromise<T> that) {
290 public static PromiseAwaiter<T> GetAwaiter<T>(this IPromise<T> that) {
291 291 Safe.ArgumentNotNull(that, "that");
292 var tcs = new TaskCompletionSource<T>();
293 292
294 that.On(tcs.SetResult, tcs.SetException, r => tcs.SetCanceled());
295
296 return tcs.Task;
293 return new PromiseAwaiter<T>(that);
297 294 }
298 295
299 296 #endif
300 297 }
301 298 }
302 299
@@ -1,46 +1,47
1 1 <?xml version="1.0" encoding="utf-8"?>
2 2 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 3 <PropertyGroup>
4 4 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5 5 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6 6 <ProductVersion>8.0.30703</ProductVersion>
7 7 <SchemaVersion>2.0</SchemaVersion>
8 8 <ProjectGuid>{15DD7123-D504-4627-8B4F-D00C7F04D033}</ProjectGuid>
9 9 <OutputType>Exe</OutputType>
10 10 <RootNamespace>MonoPlay</RootNamespace>
11 11 <AssemblyName>MonoPlay</AssemblyName>
12 12 <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
13 <ReleaseVersion>0.2</ReleaseVersion>
13 14 </PropertyGroup>
14 15 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
15 16 <DebugSymbols>true</DebugSymbols>
16 17 <DebugType>full</DebugType>
17 18 <Optimize>false</Optimize>
18 19 <OutputPath>bin\Debug</OutputPath>
19 20 <DefineConstants>DEBUG;TRACE;</DefineConstants>
20 21 <ErrorReport>prompt</ErrorReport>
21 22 <WarningLevel>4</WarningLevel>
22 23 <ConsolePause>false</ConsolePause>
23 24 </PropertyGroup>
24 25 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
25 26 <DebugType>full</DebugType>
26 27 <Optimize>true</Optimize>
27 28 <OutputPath>bin\Release</OutputPath>
28 29 <ErrorReport>prompt</ErrorReport>
29 30 <WarningLevel>4</WarningLevel>
30 31 <ConsolePause>false</ConsolePause>
31 32 </PropertyGroup>
32 33 <ItemGroup>
33 34 <Reference Include="System" />
34 35 </ItemGroup>
35 36 <ItemGroup>
36 37 <Compile Include="Program.cs" />
37 38 <Compile Include="Properties\AssemblyInfo.cs" />
38 39 </ItemGroup>
39 40 <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
40 41 <ItemGroup>
41 42 <ProjectReference Include="..\Implab\Implab.csproj">
42 43 <Project>{F550F1F8-8746-4AD0-9614-855F4C4B7F05}</Project>
43 44 <Name>Implab</Name>
44 45 </ProjectReference>
45 46 </ItemGroup>
46 47 </Project> No newline at end of file
@@ -1,44 +1,41
1 1 using System;
2 2 using Implab.Diagnostics;
3 3 using Implab.Parallels;
4 4 using Implab;
5 5 using System.Collections.Generic;
6 6 using System.Collections.Concurrent;
7 7 using System.Threading;
8 8 using Implab.JSON;
9 9 using System.IO;
10 using System.Threading.Tasks;
10 11
11 12 namespace MonoPlay {
12 13 class MainClass {
13 14
14 15
15 16 public static void Main(string[] args) {
16 17 if (args == null)
17 18 throw new ArgumentNullException("args");
18 19
19 20 var t1 = Environment.TickCount;
20 21
21 for(int i =0; i < 1000000; i++)
22 using (var tw = new StringWriter()) {
23 var jw = new JSONWriter(tw);
24
25 jw.WriteValue("\r\nhere\tvalue\u0002\u0003");
26
27 //Console.WriteLine(tw);
28 }
29
30
22 DoWork().GetAwaiter().GetResult();
31 23
32 24 var t2 = Environment.TickCount;
33 25 Console.WriteLine("done: {0} ms, {1:.00} Mb, {2} GC", t2 - t1, GC.GetTotalMemory(false) / (1024*1024), GC.CollectionCount(0) );
34 26
35 27 }
36 28
37 static void DoTest() {
29 static IPromise<int> DoItem(int x) {
30 return Promise<int>.FromResult(x + 1);
31 }
38 32
39
40
33 static async Task<int> DoWork() {
34 var c = 0;
35 for (int i = 0; i < 10000000; i++)
36 c = await DoItem(c);
37 return c;
41 38 }
42 39
43 40 }
44 41 }
General Comments 0
You need to be logged in to leave comments. Login now