25
|
1 using System;
|
|
2 using System.Threading;
|
|
3
|
|
4 namespace Implab.Parallels {
|
|
5 /// <summary>
|
|
6 /// Класс для распаралеливания задач.
|
|
7 /// </summary>
|
|
8 /// <remarks>
|
|
9 /// Используя данный класс и лямда выражения можно распараллелить
|
|
10 /// вычисления, для этого используется концепция обещаний.
|
|
11 /// </remarks>
|
|
12 public static class AsyncPool {
|
|
13
|
|
14 public static Promise<T> Invoke<T>(Func<T> func) {
|
|
15 var p = new Promise<T>();
|
|
16
|
|
17 ThreadPool.QueueUserWorkItem(param => {
|
|
18 try {
|
14
|
19 p.Resolve(func());
|
25
|
20 } catch(Exception e) {
|
|
21 p.Reject(e);
|
|
22 }
|
|
23 });
|
|
24
|
|
25 return p;
|
14
|
26 }
|
|
27
|
|
28 public static Promise<T> InvokeNewThread<T>(Func<T> func) {
|
|
29 var p = new Promise<T>();
|
|
30
|
|
31 var worker = new Thread(() => {
|
|
32 try {
|
|
33 p.Resolve(func());
|
|
34 } catch (Exception e) {
|
|
35 p.Reject(e);
|
|
36 }
|
|
37 });
|
|
38 worker.IsBackground = true;
|
|
39 worker.Start();
|
|
40
|
|
41 return p;
|
25
|
42 }
|
|
43 }
|
|
44 }
|