AsyncPool.cs
86 lines
| 2.6 KiB
| text/x-csharp
|
CSharpLexer
|
|
r35 | using Implab.Diagnostics; | ||
|
|
r25 | using System; | ||
| using System.Threading; | ||||
|
|
r120 | using System.Linq; | ||
|
|
r25 | |||
| namespace Implab.Parallels { | ||||
| /// <summary> | ||||
| /// Класс для распаралеливания задач. | ||||
| /// </summary> | ||||
| /// <remarks> | ||||
| /// Используя данный класс и лямда выражения можно распараллелить | ||||
| /// вычисления, для этого используется концепция обещаний. | ||||
| /// </remarks> | ||||
| public static class AsyncPool { | ||||
|
|
r45 | public static IPromise<T> Invoke<T>(Func<T> func) { | ||
|
|
r25 | var p = new Promise<T>(); | ||
|
|
r92 | var caller = TraceContext.Instance.CurrentOperation; | ||
|
|
r25 | |||
| ThreadPool.QueueUserWorkItem(param => { | ||||
|
|
r92 | TraceContext.Instance.EnterLogicalOperation(caller,false); | ||
|
|
r25 | try { | ||
|
|
r14 | p.Resolve(func()); | ||
|
|
r25 | } catch(Exception e) { | ||
| p.Reject(e); | ||||
|
|
r92 | } finally { | ||
| TraceContext.Instance.Leave(); | ||||
| } | ||||
|
|
r25 | }); | ||
| return p; | ||||
|
|
r14 | } | ||
|
|
r124 | public static IPromise<T> RunThread<T>(Func<T> func) { | ||
|
|
r14 | var p = new Promise<T>(); | ||
|
|
r92 | var caller = TraceContext.Instance.CurrentOperation; | ||
|
|
r35 | |||
|
|
r14 | var worker = new Thread(() => { | ||
|
|
r92 | TraceContext.Instance.EnterLogicalOperation(caller,false); | ||
|
|
r14 | try { | ||
| p.Resolve(func()); | ||||
| } catch (Exception e) { | ||||
| p.Reject(e); | ||||
|
|
r92 | } finally { | ||
| TraceContext.Instance.Leave(); | ||||
|
|
r14 | } | ||
| }); | ||||
| worker.IsBackground = true; | ||||
| worker.Start(); | ||||
| return p; | ||||
|
|
r25 | } | ||
|
|
r48 | |||
|
|
r124 | public static IPromise RunThread(Action func) { | ||
|
|
r119 | var p = new Promise(); | ||
|
|
r48 | |||
|
|
r92 | var caller = TraceContext.Instance.CurrentOperation; | ||
|
|
r48 | |||
| var worker = new Thread(() => { | ||||
|
|
r92 | TraceContext.Instance.EnterLogicalOperation(caller,false); | ||
|
|
r48 | try { | ||
| func(); | ||||
| p.Resolve(); | ||||
| } catch (Exception e) { | ||||
| p.Reject(e); | ||||
|
|
r92 | } finally { | ||
| TraceContext.Instance.Leave(); | ||||
|
|
r48 | } | ||
| }); | ||||
| worker.IsBackground = true; | ||||
| worker.Start(); | ||||
| return p; | ||||
| } | ||||
|
|
r120 | |||
|
|
r121 | public static IPromise[] RunThread(params Action[] func) { | ||
|
|
r124 | return func.Select(f => RunThread(f)).ToArray(); | ||
|
|
r120 | } | ||
|
|
r121 | public static IPromise<T>[] RunThread<T>(params Func<T>[] func) { | ||
|
|
r124 | return func.Select(f => RunThread(f)).ToArray(); | ||
|
|
r120 | } | ||
|
|
r25 | } | ||
| } | ||||
