向线程池中放入异步操作
using System; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Test { class Program { private static void AsyncOperationMethod(object objState) { Console.WriteLine("AsyncOperationMethod开始..... " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); Console.WriteLine("状态:{0}", objState ?? "(null)"); CurrentThreadInfo("AsyncOperationMethod()的"); Thread.Sleep(TimeSpan.FromSeconds(2)); } /// <summary> /// 向线程池放入异步操作 /// </summary> static void Main() { CurrentThreadInfo("主线程Main()的"); Console.WriteLine("t1开始....... " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); ThreadPool.QueueUserWorkItem(AsyncOperationMethod); Thread.Sleep(TimeSpan.FromSeconds(1)); Console.WriteLine("t2开始....... " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); ThreadPool.QueueUserWorkItem(AsyncOperationMethod, "t2传递参数state"); Thread.Sleep(TimeSpan.FromSeconds(2)); ThreadPool.QueueUserWorkItem(state => { Console.WriteLine("t3开始....... " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); Console.WriteLine("t3 Operation state: {0}", state); CurrentThreadInfo("ThreadPool t3的"); Thread.Sleep(TimeSpan.FromSeconds(2)); }, "t3传递参数state"); ThreadPool.QueueUserWorkItem( _ => { Console.WriteLine("t4开始....... " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); CurrentThreadInfo("ThreadPool t4的"); Thread.Sleep(TimeSpan.FromSeconds(2)); AsyncOperationMethod("t4传递参数state"); }); Console.WriteLine("执行完成"); Console.ReadLine(); } /// <summary> /// 当前线程信息 /// </summary> private static void CurrentThreadInfo(string name) { StringBuilder builder = new StringBuilder(); builder.AppendLine(""); builder.AppendLine(String.Format("{0}线程Id:\t\t{1}", name, Thread.CurrentThread.ManagedThreadId)); builder.AppendLine(String.Format("{0}是否使用线程池:\t{1}", name, Thread.CurrentThread.IsThreadPoolThread)); builder.AppendLine(String.Format("{0}是否后台线程:\t{1}", name, Thread.CurrentThread.IsBackground)); builder.AppendLine(String.Format("{0}线程状态:\t\t{1}", name, Thread.CurrentThread.ThreadState.ToString())); builder.AppendLine(String.Format("{0}当前时间:\t\t{1}", name, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))); builder.AppendLine(""); Console.WriteLine(builder.ToString()); } } }
打印运行结果:
/* 主线程Main()的线程Id: 10 主线程Main()的是否使用线程池: False 主线程Main()的是否后台线程: False 主线程Main()的线程状态: Running 主线程Main()的当前时间: 2016-08-15 16:13:34 t1开始....... 2016-08-15 16:13:35 AsyncOperationMethod开始..... 2016-08-15 16:13:35 状态:(null) AsyncOperationMethod()的线程Id: 11 AsyncOperationMethod()的是否使用线程池: True AsyncOperationMethod()的是否后台线程: True AsyncOperationMethod()的线程状态: Background AsyncOperationMethod()的当前时间: 2016-08-15 16:13:35 t2开始....... 2016-08-15 16:13:36 AsyncOperationMethod开始..... 2016-08-15 16:13:36 状态:t2传递参数state AsyncOperationMethod()的线程Id: 12 AsyncOperationMethod()的是否使用线程池: True AsyncOperationMethod()的是否后台线程: True AsyncOperationMethod()的线程状态: Background AsyncOperationMethod()的当前时间: 2016-08-15 16:13:36 执行完成 t3开始....... 2016-08-15 16:13:38 t4开始....... 2016-08-15 16:13:38 ThreadPool t4的线程Id: 11 ThreadPool t4的是否使用线程池: True ThreadPool t4的是否后台线程: True ThreadPool t4的线程状态: Background ThreadPool t4的当前时间: 2016-08-15 16:13:38 t3 Operation state: t3传递参数state ThreadPool t3的线程Id: 13 ThreadPool t3的是否使用线程池: True ThreadPool t3的是否后台线程: True ThreadPool t3的线程状态: Background ThreadPool t3的当前时间: 2016-08-15 16:13:38 AsyncOperationMethod开始..... 2016-08-15 16:13:40 状态:t4传递参数state AsyncOperationMethod()的线程Id: 11 AsyncOperationMethod()的是否使用线程池: True AsyncOperationMethod()的是否后台线程: True AsyncOperationMethod()的线程状态: Background AsyncOperationMethod()的当前时间: 2016-08-15 16:13:40 */
工作原理:
首先定义了AsyncOperationMethod(object objState) 方法,接受object类型的参数。
然后使用ThreadPool.QueueUserWorkItem()方法将该方法放到线程池中。
在操作完成后让线程休眠2秒钟,从而让线程池拥有为新操作重用线程的可能性。
如果线程Id是一样的,那很可能是前面的线程被重用来运行接下来的操作。

浙公网安备 33010602011771号