view Implab/Parallels/AsyncPool.cs @ 38:1cedc4e58acc diagnostics

Закрыть ветку diagnostics
author cin
date Tue, 15 Apr 2014 02:46:33 +0400
parents 313f708a50e9
children fe33f4e02ad5
line wrap: on
line source

using Implab.Diagnostics;
using System;
using System.Threading;

namespace Implab.Parallels {
	/// <summary>
	/// Класс для распаралеливания задач.
	/// </summary>
	/// <remarks>
	/// Используя данный класс и лямда выражения можно распараллелить
	/// вычисления, для этого используется концепция обещаний.
	/// </remarks>
	public static class AsyncPool {

		public static Promise<T> Invoke<T>(Func<T> func) {
			var p = new Promise<T>();
            var caller = TraceContext.Current;

			ThreadPool.QueueUserWorkItem(param => {
                TraceLog.Transfer(caller);
				try {
					p.Resolve(func());
				} catch(Exception e) {
					p.Reject(e);
				}
			});

			return p;
		}

        public static Promise<T> InvokeNewThread<T>(Func<T> func) {
            var p = new Promise<T>();

            var caller = TraceContext.Current;

            var worker = new Thread(() => {
                TraceLog.Transfer(caller);
                try {
                    p.Resolve(func());
                } catch (Exception e) {
                    p.Reject(e);
                }
            });
            worker.IsBackground = true;
            worker.Start();

            return p;
        }
	}
}