【代码保留】ThreadPoolHelper SampleCode
点击次数:22 次 发布日期:2008-11-26 10:36:08 作者:源代码网
|
源代码网推荐 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而始终无法应用到。 源代码网推荐 源代码网推荐 最后,我们需要对这个ThreadPoolHelper.QueueUserWorkItem进行改进,使其支持params,也只有这样才能实现类似上面二分算法的外部表现。 源代码网推荐 源代码网推荐 增加以下代码: 源代码网推荐 源代码网推荐 public static bool QueueUserWorkItems(params WaitCallbackNew[] proc) 源代码网推荐 { 源代码网推荐 bool result = true; 源代码网推荐 foreach (WaitCallbackNew tp in proc) 源代码网推荐 { 源代码网推荐 result &= QueueUserWorkItem(tp); 源代码网推荐 } 源代码网推荐 return result; 源代码网推荐 } 源代码网推荐 如此就可以实现形如: 源代码网推荐 源代码网推荐 ThreadPoolHelper.QueueUserWorkItems(ThreadProc, ThreadProc, ThreadProc); 源代码网推荐 再加上.NET2.0以上版本对匿名委托的支持,就可以有: 源代码网推荐 源代码网推荐 ThreadPoolHelper.QueueUserWorkItems( 源代码网推荐 delegate { Console.WriteLine("a"); }, 源代码网推荐 delegate { Console.WriteLine("b"); }, 源代码网推荐 delegate { Console.WriteLine("c"); } 源代码网推荐 ); 源代码网推荐 这样的代码了。 源代码网推荐 源代码网推荐 源代码网推荐 全部示例: 源代码网推荐 源代码网推荐 //ThreadPoolHelper.cs 源代码网推荐 源代码网推荐 源代码网推荐 ThreadPoolHelper.cs 源代码网推荐 using System; 源代码网推荐 using System.Threading; 源代码网推荐 源代码网推荐 namespace CA_ThreadPool 源代码网推荐 { 源代码网推荐 /// <summary> 源代码网推荐 /// Sample helper class for ThreadPool. 源代码网推荐 /// </summary> 源代码网推荐 class ThreadPoolHelper 源代码网推荐 { 源代码网推荐 /// <summary> 源代码网推荐 /// The delegate for explicit method. 源代码网推荐 /// </summary> 源代码网推荐 public delegate void WaitCallbackNew(); 源代码网推荐 源代码网推荐 /// <summary> 源代码网推荐 /// The WaitCallback delegate object in actual of our thread pool. 源代码网推荐 /// </summary> 源代码网推荐 /// <param name="state"></param> 源代码网推荐 static void Callback(object state) 源代码网推荐 { 源代码网推荐 (state as WaitCallbackNew)(); 源代码网推荐 } 源代码网推荐 源代码网推荐 /// <summary> 源代码网推荐 /// Queues a method for execution. 源代码网推荐 /// The method executes when a thread pool thread becomes available. 源代码网推荐 /// </summary> 源代码网推荐 /// <param name="proc"></param> 源代码网推荐 /// <returns></returns> 源代码网推荐 public static bool QueueUserWorkItem(WaitCallbackNew callback) 源代码网推荐 { 源代码网推荐 return ThreadPool.QueueUserWorkItem(new WaitCallback(Callback), callback); 源代码网推荐 } 源代码网推荐 源代码网推荐 /// <summary> 源代码网推荐 /// Queues a few method for execution. 源代码网推荐 /// The method executes when a thread pool thread becomes available. 源代码网推荐 /// </summary> 源代码网推荐 /// <param name="proc"></param> 源代码网推荐 /// <returns></returns> 源代码网推荐 public static bool QueueUserWorkItems(params WaitCallbackNew[] proc) 源代码网推荐 { 源代码网推荐 bool result = true; 源代码网推荐 foreach (WaitCallbackNew tp in proc) 源代码网推荐 { 源代码网推荐 result &= QueueUserWorkItem(tp); 源代码网推荐 } 源代码网推荐 return result; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 //ThreadPoolHelperExample.cs 源代码网推荐 源代码网推荐 源代码网推荐 ThreadPoolHelperExample.cs 源代码网推荐 using System; 源代码网推荐 using System.Threading; 源代码网推荐 源代码网推荐 namespace CA_ThreadPool 源代码网推荐 { 源代码网推荐 public class Example 源代码网推荐 { 源代码网推荐 public static void Main() 源代码网推荐 { 源代码网推荐 // 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); 源代码网推荐 // 源代码网推荐 //The code above will be predigested to the code down! 源代码网推荐 // 源代码网推荐 ThreadPoolHelper.QueueUserWorkItems(ThreadProc, ThreadProc, ThreadProc); 源代码网推荐 // 源代码网推荐 //The code above will be evolved to the code down! 源代码网推荐 // 源代码网推荐 ThreadPoolHelper.QueueUserWorkItems( 源代码网推荐 delegate { Console.WriteLine("a"); }, 源代码网推荐 delegate { Console.WriteLine("b"); }, 源代码网推荐 delegate { Console.WriteLine("c"); } 源代码网推荐 ); 源代码网推荐 源代码网推荐 Console.WriteLine("Main thread does some work, then sleeps."); 源代码网推荐 // If you comment out the Sleep, the main thread exits before 源代码网推荐 // the thread pool task runs. The thread pool uses background 源代码网推荐 // threads, which do not keep the application running. (This 源代码网推荐 // is a simple example of a race condition.) 源代码网推荐 Thread.Sleep(1000); 源代码网推荐 源代码网推荐 Console.WriteLine("Main thread exits."); 源代码网推荐 } 源代码网推荐 源代码网推荐 // This thread procedure performs the task. 源代码网推荐 static void ThreadProc() 源代码网推荐 { 源代码网推荐 // No state object was passed to QueueUserWorkItem, so 源代码网推荐 // stateInfo is null. 源代码网推荐 Console.WriteLine("Hello from the thread pool.()"); 源代码网推荐 } 源代码网推荐 源代码网推荐 // This thread procedure performs the task. 源代码网推荐 static void ThreadProc(object stateInfo) 源代码网推荐 { 源代码网推荐 // No state object was passed to QueueUserWorkItem, so 源代码网推荐 // stateInfo is null. 源代码网推荐 Console.WriteLine("Hello from the thread pool.(object stateInfo)"); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
