C#多线程Task类的使用(一)

关于多线程前面到工.NET1.0版本出来的Thread,.NET2.0版本出来的ThreadPool,那么今天我们介绍.NET3.0出来的新的多线程操作的类Task。相对于前面的两个版本出来的多线程操作类,Task类更加的强大,提供了丰富的Api。下面我们介绍Task的使用

一、新建
新建窗口项目,将项目属性中的输出类型设置为控制台输出。如下所示:
C#多线程Task类的使用(一)_第1张图片

定义两个方法以作试验用

#region   //两个共用方法用作调用
public void doSomething1(string name)  //定义一个方法名为doSomething1()
{
    Console.WriteLine("doSometing1方法调用开始");

    Thread.Sleep(2000);                //将当前的线程暂停2000ms即2秒

    //输出调用方名称+当前线程名+本方法标识
    Console.WriteLine("用:" + name + "在" + Thread.CurrentThread.ManagedThreadId.ToString("00") + "线程中执行方法1\n");
}

public void doSomething2(string name)  //定义一个方法名为doSomething2()
{
    Console.WriteLine("doSometing2方法调用开始");

    Thread.Sleep(2000);               //将当前的线程暂停2000ms即2秒

    //输出调用方名称+当前线程名+本方法标识
    Console.WriteLine("用:" + name + "在" + Thread.CurrentThread.ManagedThreadId.ToString("00") + "线程中执行方法2\n");
}
#endregion

二、多线程Task的基本使用

#region   //多线程Task的基本使用,总共有以下几种方法
private void button1_Click(object sender, EventArgs e)
{
    Console.WriteLine("Task使用演示开始");
    Task task1 = new Task(() => 
    {
        Console.WriteLine("task1的线程ID为{0}", Thread.CurrentThread.ManagedThreadId.ToString());              
    });
    task1.Start();  //线程开始

    Task task2 = Task.Run(()=>
    {
        Console.WriteLine("task2的线程ID为{0}", Thread.CurrentThread.ManagedThreadId.ToString());
    });

    TaskFactory taskFactory1=Task.Factory;
    Task task3=taskFactory1.StartNew(()=>
    {
        this.doSomething1("taskFactory1已执行");
    });

    TaskFactory taskFactory2 = new TaskFactory();
    Task task4 = taskFactory2.StartNew(() =>
    {
        this.doSomething2("taskFactory2已执行");
    });           
}
#endregion

程序执行结果如下图:
C#多线程Task类的使用(一)_第2张图片

三、Task与ThreadPool的关系

Task与ThreadPool有没有关系呢?答案是肯定的,其实Task是从ThreadPool来的,他们受制于ThreadPool。以下为相关说明以助佐证。

#region  //Task的线程来自于线程池
private void button2_Click(object sender, EventArgs e)
    {
        //ThreadPool.SetMaxThreads(8,8);  //设置线程池中的线程最大数目。
        for (int i = 0; i < 100; i++)
		{
            int k = i;
			Task myTask = Task.Run(() =>
            {
                Console.WriteLine("这是第{0}次执行,线程ID为:{1}",k,Thread.CurrentThread.ManagedThreadId.ToString());
                Thread.Sleep(3000);
            });
		}
        /*
         * 如果不设置线程池的最大线程大小的话,上述代码运行中用到的线程数不止8个
         * 如果设置了线程池的最大线程大小的话,上述代码运行中用到的线程数一定不超过8个
         * 从而可以作证,Task就是从ThreadPool里来的,受线程池管控        
         */
        Console.WriteLine("测试完成");
    }
#endregion

上述代码运行之后可以看出每次迭代所分配的线程ID,如果没有设置ThreadPool线程池的最大线程数的话,运行过程总分配的不同的线程数目可能不止8个。但是设置了ThreadPool线程池中线程数目的话,最终执行后线程分配的ID中不会超过8种,这就能够证明Task与ThreadPool之间的关系了。

你可能感兴趣的:(C#宝典)