向线程池中放入异步操作

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是一样的,那很可能是前面的线程被重用来运行接下来的操作。

posted @ 2016-08-15 15:11  茗::流  阅读(156)  评论(0)    收藏  举报
如有雷同,纯属参考。如有侵犯你的版权,请联系我。