using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ProjectBase.Data.Threading
{
///
/// 线程池辅助操作类
///
public class ThreadPoolHelper
{
///
/// 方法委托
///
public delegate void WaitCallbackNew();
///
/// (集合)通知等待线程,事件已经发生。这个类不能被继承。
///
private static List AutoResetEvents;
///
/// 线程池的实际WaitCallback委托对象。
///
///
static void Callback(object state)
{
WaitCallbackHelper wcbh = (state as WaitCallbackHelper);
wcbh.Callback();
(wcbh.WaitHandle as AutoResetEvent).Set();
}
///
/// 把执行方法放到队列中。
/// 当线程池线程变为可用的时候,方法执行。
///
/// 委托对象
public static bool QueueUserWorkItem(WaitCallbackNew callback)
{
WaitCallbackHelper wcbh = new WaitCallbackHelper();
wcbh.Callback = callback;
wcbh.WaitHandle = new AutoResetEvent(false);
if (AutoResetEvents == null)
{
AutoResetEvents = new List();
}
AutoResetEvents.Add(wcbh.WaitHandle);
return ThreadPool.QueueUserWorkItem(new WaitCallback(Callback), wcbh);
}
///
/// 把执行方法放到队列中。
/// 当线程池线程变为可用的时候,方法执行。
///
/// 委托对象数组
///
public static bool QueueUserWorkItems(params WaitCallbackNew[] proc)
{
bool result = true;
foreach (WaitCallbackNew tp in proc)
{
result &= QueueUserWorkItem(tp);
}
return result;
}
///
///等待指定数组中所有元素收到信号
///
public static bool WaitAll()
{
return WaitHandle.WaitAll(AutoResetEvents.ToArray());
}
///
///等待指定数组中任何一个元素收到信号
///
/// 满足等待的对象数组索引
public static int WaitAny()
{
return WaitHandle.WaitAny(AutoResetEvents.ToArray());
}
///
/// 一个回调一个WaitHandle容器
///
class WaitCallbackHelper
{
public WaitCallbackNew Callback
{
get;
set;
}
public WaitHandle WaitHandle
{
get;
set;
}
}
}
}