[ 来源:http://www.it55.com | 作者: | 时间:2007-12-24 | 收藏 | 推荐 ] 【大 中 小】
在使用ThreadPool的时候,我们可能会经常使用到QueueUserWorkItem这个静态方法,这个方法的两个版本如下
public static bool QueueUserWorkItem(
WaitCallback callBack
)
public static bool QueueUserWorkItem(
WaitCallback callBack,
Object state
)
这两个版本都使用了WaitCallback的一个委托对象作为方法参数。
[ComVisibleAttribute(true)]
public delegate void WaitCallback(
Object state
)
而WaitCallback委托要求的委托签名带有一个object的参数。但有时候我们的实际需要可能不是一个带参数的WaitCallback函数。因此类似:
public delegate void WaitCallback()
这样的需求开始出现。
而了解WaitCallback通常又是不必要的,我们只想把代码并行执行。仅此而已。
下面这段代码是来自http://msdn.microsoft.com/msdnmag/issues/07/10/Futures/default.aspx?loc=zh的一段代码。
static void ParQuickSort<T>(T[] domain, int lo, int hi) where T : IComparable<T>
{
if (hi - lo <= Threshold) InsertionSort(domain, lo, hi);
int pivot = Partition(domain, lo, hi);
Parallel.Do(
delegate { ParQuickSort(domain, lo, pivot - 1); },
delegate { ParQuickSort(domain, pivot + 1, hi); }
);
}
以上代码中的Parallel.Do则是实现了将其委托参数作为并行计算的不同步骤进行并行运算的一个方法(它包含在MS Parallel Framework System.Concurrency中)。但是我们在.NET2.0或者哪怕是新出的.NET3.5framework中我们仍然无法找到它们。那么用旧有的线程池技术我们也来实现相似的功能。
我们有三个问题要解决:
1、从public delegate void WaitCallback( Object state )向public delegate void WaitCallbackNew()转变;
2、从public static bool QueueUserWorkItem( WaitCallback callBack )向public static bool QueueUserWorkItem( WaitCallbackNew callBack )转变;
3、从public static bool QueueUserWorkItem( WaitCallbackNew callBack )向public static bool QueueUserWorkItem( params WaitCallbackNew[] callBack )转变;
因此,首先我们定义了新的委托:
public delegate void WaitCallbackNew();
再次,我们增加我们的新方法:
public static bool QueueUserWorkItem(WaitCallbackNew callback)
{
}
这里我们要实现的是类似ThreadPool.QueueUserWorkItem(WaitCallback callback);的效果,但这里的callback由于参数不匹配,我们暂无法实现直接将委托采用类似重载的技术将其直接作为参数传入ThreadPool.QueueUserWorkItem(WaitCallback callback);但是很快我们注意到,ThreadPool.QueueUserWorkItem有一个重载,ThreadPool.QueueUserWorkItem(WaitCallback callback,Ojbect state);这个state的作用就是一个可以传递给WaitCallback的一个参数,因此这里我们应该换一个思路,而不是类似重载一样直接套用。将代码添加进上面的方法体内,于此同时我们应该构建一个用于WaitCallback的方法体用于满足我们对WaitCallback的依赖以及提供一个执行新委托的环境。
static void Callback(object state)
{
(state as WaitCallbackNew)();
}
public static bool QueueUserWorkItem(WaitCallbackNew callback)
{
return ThreadPool.QueueUserWorkItem(new WaitCallback(Callback), callback);
}
这样我们的代码基本上就可以实现类似:
// Queue the task.
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));
//
//The code above will be predigested to the code down!
//
ThreadPoolHelper.QueueUserWorkItem(ThreadProc);
ThreadPoolHelper.QueueUserWorkItem(ThreadProc);
ThreadPoolHelper.QueueUserWorkItem(ThreadProc);
// This thread procedure performs the task.
static void ThreadProc()
{
Console.WriteLine("Hello from the thread pool.()");
}
// This thread procedure performs the task.
static void ThreadProc(object stateInfo)
{
Console.WriteLine("Hello from the thread pool.(object stateInfo)");
}
这样的功能了。其中第一套方案为MSDN用于描述ThreadPool的QueueUserWorkItem方法的。而第二套方案则实现了无参数方法的委托。因此static void ThreadProc() 可以被正确地调用,而不必像static void ThreadProc(object stateInfo) 一样提供无畏的stateInfo而始终无法应用到。
(编辑:IT资讯之家 www.it55.com)