C#并行库Task类介绍

 更新时间:2022年06月16日 11:23:19   作者:天方  
这篇文章介绍了C#并行库Task类,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

Task和ThreadPool的功能类似,可以用来创建一些轻量级的并行任务。对于将一个任务放进线程池

ThreadPool.QueueUserWorkItem(A);

这段代码用Task来实现的话,方式如下:

Task.Create(A);

这两端代码的使用和实现的功能都十分相似。但和TheadPool相比,Task有着更多的功能,更加方便我们使用。

Task.WaitAll()该函数的功能是等待多个任务等待任务完成,这在线程同步时经常需要用到。

假如我们要创建三个任务,并等待它们完成。这个功能用TheadPool实现如下:

    using (ManualResetEvent mre1 = new ManualResetEvent(false))
    using (ManualResetEvent mre2 = new ManualResetEvent(false))
    using (ManualResetEvent mre3 = new ManualResetEvent(false))
    {
        ThreadPool.QueueUserWorkItem(delegate
        {
            A();
            mre1.Set();
        });
        ThreadPool.QueueUserWorkItem(delegate
        {
            B();
            mre2.Set();
        });
        ThreadPool.QueueUserWorkItem(delegate
        {
            C();
            mre3.Set();
        });
        WaitHandle.WaitAll(new WaitHandle[] { mre1, mre2, mre3 });
    }

用Task类实现起来就相对简单多了:

    Task t1 = Task.Create(delegate { A(); });
    Task t2 = Task.Create(delegate { B(); });
    Task t3 = Task.Create(delegate { C(); });
    t1.Wait();
    t2.Wait();
    t3.Wait();

或者我们还可以这么写:

    Task t1 = Task.Create(delegate { A(); });
    Task t2 = Task.Create(delegate { B(); });
    Task t3 = Task.Create(delegate { C(); });
    Task.WaitAll(t1, t2, t3);
  • Task.Cancel和Task.CancelAndWait这个是一个成员函数,用于取消已经创建的Task,如果该Task正在执行中,该函数并不终止Task的执行,只是将IsCanceled属性设置为true。
    Task.Cancel和Task.CancelAndWait的区别在于:Task.CancelAndWait除了取消Task外,还将等待该Task执行完成(如果该Task在执行中)。

  • Task.ContinueWith该成员函数的作用是在执行完Task后,再执行一个后续操作。这也是一个比较有用的功能,由于比较简单,就不介绍了。

除了上述介绍的几个方法外,Task还有一些比较有用的属性和方法,也非常简单,直接参看其说明文档即可。

TaskManager和TaskManagerPolicy

这两个类主要是对Task的策略进行管理,主要管理的属性包括:最少处理Task的处理器个数、理想处理Task的处理器个数、理想的处理线程数及优先级几个属性。

在Task中使用TaskManager非常简单,只要在创建Task时将manager传入构造函数中即可。如下例所示:

    var manager = new TaskManager(new TaskManagerPolicy(1, 1,1));
    var t1 = Task.Create(x => Thread.Sleep(2000), manager);
    var t2 = Task.Create(x => Thread.Sleep(2000), manager);

    var start = DateTime.Now;
    Task.WaitAll(t1, t2);
    var end = DateTime.Now;

    Console.WriteLine(end-start);

在这里我将处理线程个数设置了为1,这样的话,只有一个线程来处理Task,执行这两个Task总共花费的时间为4秒;而在使用默认manager时候,这两个任务是并发执行的,只需要两秒即可执行完成。

异常处理

当Task在执行过程中发生异常时,该异常会在Wait或WaitAll函数中重新throw。可以通过Task的Exception属性来获取发生的异常。

    var t1 = Task.Create(x => { throw new Exception("t1 error occor"); });
    var t2 = Task.Create(x => { throw new Exception("t2 error occor"); });

    try
    {
        Task.WaitAll(t1, t2);
    }
    catch(Exception)
    {
        Console.WriteLine(t1.Exception.InnerException.Message);
        Console.WriteLine(t2.Exception.InnerException.Message);
    }

另外,顺带简单的介绍一下Future类,这个类的功能和用法和Task非常相似,完全可以看做一个带返回值的Task。示例如下:

    var f1 = Future.Create(() => 3);

    f1.Wait();
    Console.WriteLine(f1.Value);

到此这篇关于C#并行库Task类的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#之set与get方法的用法案例

    C#之set与get方法的用法案例

    这篇文章主要介绍了C#之set与get方法的用法案例,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C#使用LINQ查询操作符实例代码(一)

    C#使用LINQ查询操作符实例代码(一)

    这篇文章介绍了C#使用LINQ查询操作符的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C# Hashtable/Dictionary写入和读取对比详解

    C# Hashtable/Dictionary写入和读取对比详解

    本文中将从基础角度讲解HashTable、Dictionary的构造和通过程序进行插入读取对比
    2013-11-11
  • C#探秘系列(一)——ToDictionary,ToLookup

    C#探秘系列(一)——ToDictionary,ToLookup

    这个系列我们看看C#中有哪些我们知道,但是又不知道怎么用,又或者懒得去了解的东西,比如这篇我们要介绍的toDictionary和ToLookup。
    2014-05-05
  • C#中List和SortedList的简介

    C#中List和SortedList的简介

    今天小编就为大家分享一篇关于C#中List和SortedList的简介,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • C# 参考之访问关键字:base、this

    C# 参考之访问关键字:base、this

    由于静态成员函数存在于类一级,并且不是对象的一部分,因此没有 this 指针。在静态方法中引用 this 是错误的。 索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。
    2008-03-03
  • C#学习基础概念二十五问

    C#学习基础概念二十五问

    C#学习基础概念二十五问...
    2007-04-04
  • C# Socket网络编程实例

    C# Socket网络编程实例

    这篇文章主要介绍了C# Socket网络编程实例,分析了Socket网络通信的原理与具体应用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • c#代码生成URL地址的示例

    c#代码生成URL地址的示例

    这篇文章主要介绍了c#代码生成URL地址的方法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • C#中紧耦合Tight Coupling和松耦合Loose Coupling的实现

    C#中紧耦合Tight Coupling和松耦合Loose Coupling的实现

    紧耦合和松耦合是描述模块或组件之间耦合程度的两个概念,本文主要介绍了C#中紧耦合Tight Coupling和松耦合Loose Coupling的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01

最新评论