AsyncPool.cs
71 lines
| 1.9 KiB
| text/x-csharp
|
CSharpLexer
cin
|
r35 | using Implab.Diagnostics; | ||
cin
|
r25 | using System; | ||
using System.Threading; | ||||
namespace Implab.Parallels { | ||||
/// <summary> | ||||
/// Класс для распаралеливания задач. | ||||
/// </summary> | ||||
/// <remarks> | ||||
/// Используя данный класс и лямда выражения можно распараллелить | ||||
/// вычисления, для этого используется концепция обещаний. | ||||
/// </remarks> | ||||
public static class AsyncPool { | ||||
cin
|
r45 | public static IPromise<T> Invoke<T>(Func<T> func) { | ||
cin
|
r25 | var p = new Promise<T>(); | ||
cin
|
r40 | var caller = TraceContext.Snapshot(); | ||
cin
|
r25 | |||
ThreadPool.QueueUserWorkItem(param => { | ||||
cin
|
r48 | TraceContext.Fork(caller); | ||
cin
|
r25 | try { | ||
cin
|
r14 | p.Resolve(func()); | ||
cin
|
r25 | } catch(Exception e) { | ||
p.Reject(e); | ||||
} | ||||
}); | ||||
return p; | ||||
cin
|
r14 | } | ||
cin
|
r45 | public static IPromise<T> InvokeNewThread<T>(Func<T> func) { | ||
cin
|
r14 | var p = new Promise<T>(); | ||
cin
|
r40 | var caller = TraceContext.Snapshot(); | ||
cin
|
r35 | |||
cin
|
r14 | var worker = new Thread(() => { | ||
cin
|
r48 | TraceContext.Fork(caller); | ||
cin
|
r14 | try { | ||
p.Resolve(func()); | ||||
} catch (Exception e) { | ||||
p.Reject(e); | ||||
} | ||||
}); | ||||
worker.IsBackground = true; | ||||
worker.Start(); | ||||
return p; | ||||
cin
|
r25 | } | ||
cin
|
r48 | |||
cin
|
r66 | public static IPromise InvokeNewThread(Action func) { | ||
cin
|
r48 | var p = new Promise<object>(); | ||
var caller = TraceContext.Snapshot(); | ||||
var worker = new Thread(() => { | ||||
TraceContext.Fork(caller); | ||||
try { | ||||
func(); | ||||
p.Resolve(); | ||||
} catch (Exception e) { | ||||
p.Reject(e); | ||||
} | ||||
}); | ||||
worker.IsBackground = true; | ||||
worker.Start(); | ||||
return p; | ||||
} | ||||
cin
|
r25 | } | ||
} | ||||