zoukankan      html  css  js  c++  java
  • .Net并行库介绍——Task(1)

    TaskThreadPool的功能类似,可以用来创建一些轻量级的并行任务。对于将一个任务放进线程池
        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.CancelTask.CancelAndWait
      这个是一个成员函数,用于取消已经创建的Task,如果该Task正在执行中,该函数并不终止Task的执行,只是将IsCanceled属性设置为true
      Task.CancelTask.CancelAndWait的区别在于:Task.CancelAndWait除了取消Task外,还将等待该Task执行完成(如果该Task在执行中)。
    • Task.ContinueWith
      该成员函数的作用是在执行完Task后,再执行一个后续操作。这也是一个比较有用的功能,由于比较简单,就不介绍了。

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

    本文主要介绍了Task的基本的用法,下篇文章将介绍一些进阶的知识。

  • 相关阅读:
    微信小程序入门
    rem js相关
    移动端rem.js使用方法
    手机访问PC网站自动跳转到手机版
    当 return 遇到 try
    Ubuntu apt 使用代理
    shell 十进制数字转十六进制字符串并将结果保存到变量
    (二)一起学 Java Collections Framework 源码之 AbstractCollection
    (一)一起学 Java Collections Framework 源码之 概述
    解决 meld 出现 locale.setlocale(locale.LC_ALL,'') 失败的问题
  • 原文地址:https://www.cnblogs.com/TianFang/p/1367059.html
Copyright © 2011-2022 走看看