执行简单的计算限制操作

作者:追风剑情 发布于:2017-7-10 22:22 分类:C#

要将一个异步的计算限制操作放到线程池的队列中,通常可以调用ThreadPool类定义的以下方法之一:

static Boolean QueueUserWorkItem(WaitCallback callBack);
static Boolean QueueUserWorkItem(WaitCallback callBack, Object state);

这些方法向线程池的队列添加一个“工作项”(work item)以及可选的状态数据。然后,所有方法会立即返回。工作项其实就是由callBack参数标识的一个方法,该方法将由线程池线程调用。可向方法传递一个state实参(状态数据)。无state参数的那个版本的QueueUserWorkItem则向回调方法传递null。最终,池中的某个线程会处理工作项,造成你指定的方法被调用。你写的回调方法必须匹配System.Threading.WaitCallback委托类型,后者的定义如下:

delegate void WaitCallback(Object state);

注意 WaitCallback委托、TimerCallback委托和ParameterizedThreadStart委托签名完全一致。定义和该签名匹配的方法后,使用ThreadPool.QueueUserWorkItem、System.Threading.Timer和System.Threading.Thread对象都可调用该方法。

以下代码演示了如何让一个线程池线程以异步方式调用一个方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ThreadPoolTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //以下代码演示了如何让一个线程池线程以异步方式调用一个方法
            Console.WriteLine("Main thread: queuing an asynchronous operation");
            ThreadPool.QueueUserWorkItem(ComputeBoundOp, 5);
            Console.WriteLine("Main thread: Doing other work here...");
            Thread.Sleep(100000);//模拟其他工作(10秒)
            Console.WriteLine("Hit <Enter> to end this program...");
            Console.ReadLine();
        }

        private static void ComputeBoundOp(Object state)
        {
            //这个方法由一个线程池线程执行

            Console.WriteLine("In ComputeBoundOp: state={0}", state);
            Thread.Sleep(1000);//模拟其他工作(1秒)

            //这个方法返回后,线程回到池中,等待另一个任务
        }
    }
}

11111.png
有时也得到以下输出:
Main thread: queuing an asynchronous operation
In ComputeBoundOp: state=5
Main thread: Doing other work here...

之所以输出行的顺序会发生变化,是因为两个方法相互之间是异步运行的。Windows调度器决定先调度哪一个线程。如果应用程序在多核机器上运行,可能同时调度它们。

注意 一旦回调方法抛出未处理的异常,CLR会终止进程(除非宿主强加了它自己的策略)。


注意 对于Windows Store应用,System.Threading.ThreadPool类是没有公开的。但在使用System.Threading.Tasks命名空间中的类型时,这个类被间接地使用。


标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号