Mercurial > pub > ImplabNet
comparison Implab/Parallels/AsyncPool.cs @ 192:f1da3afc3521 release v2.1
Слияние с v2
| author | cin | 
|---|---|
| date | Fri, 22 Apr 2016 13:10:34 +0300 | 
| parents | 706fccb85524 | 
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| 71:1714fd8678ef | 192:f1da3afc3521 | 
|---|---|
| 1 using Implab.Diagnostics; | 1 using Implab.Diagnostics; | 
| 2 using System; | 2 using System; | 
| 3 using System.Threading; | 3 using System.Threading; | 
| 4 using System.Linq; | |
| 4 | 5 | 
| 5 namespace Implab.Parallels { | 6 namespace Implab.Parallels { | 
| 6 /// <summary> | 7 /// <summary> | 
| 7 /// Класс для распаралеливания задач. | 8 /// Класс для распаралеливания задач. | 
| 8 /// </summary> | 9 /// </summary> | 
| 12 /// </remarks> | 13 /// </remarks> | 
| 13 public static class AsyncPool { | 14 public static class AsyncPool { | 
| 14 | 15 | 
| 15 public static IPromise<T> Invoke<T>(Func<T> func) { | 16 public static IPromise<T> Invoke<T>(Func<T> func) { | 
| 16 var p = new Promise<T>(); | 17 var p = new Promise<T>(); | 
| 17 var caller = TraceContext.Snapshot(); | 18 var caller = TraceContext.Instance.CurrentOperation; | 
| 18 | 19 | 
| 19 ThreadPool.QueueUserWorkItem(param => { | 20 ThreadPool.QueueUserWorkItem(param => { | 
| 20 TraceContext.Fork(caller); | 21 TraceContext.Instance.EnterLogicalOperation(caller,false); | 
| 21 try { | 22 try { | 
| 22 p.Resolve(func()); | 23 p.Resolve(func()); | 
| 23 } catch(Exception e) { | 24 } catch(Exception e) { | 
| 24 p.Reject(e); | 25 p.Reject(e); | 
| 25 } | 26 } finally { | 
| 27 TraceContext.Instance.Leave(); | |
| 28 } | |
| 26 }); | 29 }); | 
| 27 | 30 | 
| 28 return p; | 31 return p; | 
| 29 } | 32 } | 
| 30 | 33 | 
| 31 public static IPromise<T> InvokeNewThread<T>(Func<T> func) { | 34 public static IPromise<T> Invoke<T>(Func<ICancellationToken, T> func) { | 
| 35 var p = new Promise<T>(); | |
| 36 var caller = TraceContext.Instance.CurrentOperation; | |
| 37 | |
| 38 ThreadPool.QueueUserWorkItem(param => { | |
| 39 TraceContext.Instance.EnterLogicalOperation(caller,false); | |
| 40 try { | |
| 41 p.Resolve(func(p)); | |
| 42 } catch(Exception e) { | |
| 43 p.Reject(e); | |
| 44 } finally { | |
| 45 TraceContext.Instance.Leave(); | |
| 46 } | |
| 47 }); | |
| 48 | |
| 49 return p; | |
| 50 } | |
| 51 | |
| 52 public static IPromise<T> RunThread<T>(Func<T> func) { | |
| 32 var p = new Promise<T>(); | 53 var p = new Promise<T>(); | 
| 33 | 54 | 
| 34 var caller = TraceContext.Snapshot(); | 55 var caller = TraceContext.Instance.CurrentOperation; | 
| 35 | 56 | 
| 36 var worker = new Thread(() => { | 57 var worker = new Thread(() => { | 
| 37 TraceContext.Fork(caller); | 58 TraceContext.Instance.EnterLogicalOperation(caller,false); | 
| 38 try { | 59 try { | 
| 39 p.Resolve(func()); | 60 p.Resolve(func()); | 
| 40 } catch (Exception e) { | 61 } catch (Exception e) { | 
| 41 p.Reject(e); | 62 p.Reject(e); | 
| 63 } finally { | |
| 64 TraceContext.Instance.Leave(); | |
| 65 } | |
| 66 }); | |
| 67 worker.IsBackground = true; | |
| 68 worker.Start(); | |
| 69 | |
| 70 return p; | |
| 71 } | |
| 72 | |
| 73 public static IPromise<T> RunThread<T>(Func<ICancellationToken, T> func) { | |
| 74 var p = new Promise<T>(); | |
| 75 | |
| 76 var caller = TraceContext.Instance.CurrentOperation; | |
| 77 | |
| 78 var worker = new Thread(() => { | |
| 79 TraceContext.Instance.EnterLogicalOperation(caller,false); | |
| 80 try { | |
| 81 p.Resolve(func(p)); | |
| 82 } catch (Exception e) { | |
| 83 p.Reject(e); | |
| 84 } finally { | |
| 85 TraceContext.Instance.Leave(); | |
| 42 } | 86 } | 
| 43 }); | 87 }); | 
| 44 worker.IsBackground = true; | 88 worker.IsBackground = true; | 
| 45 worker.Start(); | 89 worker.Start(); | 
| 46 | 90 | 
| 47 return p; | 91 return p; | 
| 48 } | 92 } | 
| 49 | 93 | 
| 50 | 94 | 
| 51 public static IPromise InvokeNewThread(Action func) { | 95 public static IPromise RunThread(Action func) { | 
| 52 var p = new Promise<object>(); | 96 var p = new Promise(); | 
| 53 | 97 | 
| 54 var caller = TraceContext.Snapshot(); | 98 var caller = TraceContext.Instance.CurrentOperation; | 
| 55 | 99 | 
| 56 var worker = new Thread(() => { | 100 var worker = new Thread(() => { | 
| 57 TraceContext.Fork(caller); | 101 TraceContext.Instance.EnterLogicalOperation(caller,false); | 
| 58 try { | 102 try { | 
| 59 func(); | 103 func(); | 
| 60 p.Resolve(); | 104 p.Resolve(); | 
| 61 } catch (Exception e) { | 105 } catch (Exception e) { | 
| 62 p.Reject(e); | 106 p.Reject(e); | 
| 107 } finally { | |
| 108 TraceContext.Instance.Leave(); | |
| 63 } | 109 } | 
| 64 }); | 110 }); | 
| 65 worker.IsBackground = true; | 111 worker.IsBackground = true; | 
| 66 worker.Start(); | 112 worker.Start(); | 
| 67 | 113 | 
| 68 return p; | 114 return p; | 
| 69 } | 115 } | 
| 116 | |
| 117 public static IPromise RunThread(Action<ICancellationToken> func) { | |
| 118 var p = new Promise(); | |
| 119 | |
| 120 var caller = TraceContext.Instance.CurrentOperation; | |
| 121 | |
| 122 var worker = new Thread(() => { | |
| 123 TraceContext.Instance.EnterLogicalOperation(caller,false); | |
| 124 try { | |
| 125 func(p); | |
| 126 p.Resolve(); | |
| 127 } catch (Exception e) { | |
| 128 p.Reject(e); | |
| 129 } finally { | |
| 130 TraceContext.Instance.Leave(); | |
| 131 } | |
| 132 }); | |
| 133 worker.IsBackground = true; | |
| 134 worker.Start(); | |
| 135 | |
| 136 return p; | |
| 137 } | |
| 138 | |
| 139 public static IPromise[] RunThread(params Action[] func) { | |
| 140 return func.Select(f => RunThread(f)).ToArray(); | |
| 141 } | |
| 142 | |
| 143 public static IPromise[] RunThread(params Action<ICancellationToken>[] func) { | |
| 144 return func.Select(f => RunThread(f)).ToArray(); | |
| 145 } | |
| 146 | |
| 147 public static IPromise<T>[] RunThread<T>(params Func<T>[] func) { | |
| 148 return func.Select(f => RunThread(f)).ToArray(); | |
| 149 } | |
| 150 | |
| 151 public static IPromise<T>[] RunThread<T>(params Func<ICancellationToken, T>[] func) { | |
| 152 return func.Select(f => RunThread(f)).ToArray(); | |
| 153 } | |
| 70 } | 154 } | 
| 71 } | 155 } | 
