设为首页 加入收藏

TOP

多线程编程学习笔记——任务并行库(三)(一)
2019-09-02 23:56:12 】 浏览:27
Tags:线程 编程 学习 笔记 任务 并行

接上文 多线程编程学习笔记——任务并行库(一)

接上文 多线程编程学习笔记——任务并行库(二)

 

六、   实现取消选项

          本示例学习如何实现基于Task的异步操作进行取消流程,以及在任务真正运行前如何知道任务已经被取消。

1.代码如下:

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

namespace ThreadTPLDemo
{   

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(" 将Task中实现取消操作。。。");
            var cts =new CancellationTokenSource();

            var task1 = new Task<int>(() => RunTask("任务 1",10, cts.Token),cts.Token);     

                     Console.WriteLine(" ——task1 状态—{0}", task1.Status);

            cts.Cancel();
                     Console.WriteLine(" ——取消——task1 状态—{0}—",task1.Status);            

                     Console.WriteLine(" ——task1 在出错之前 取消了操作—");

            //task1.Start();
            cts = new CancellationTokenSource();
            var task2 = new Task<int>(() => RunTask("任务 2", 10, cts.Token),cts.Token);
            task2.Start();
            for (int i = 0; i < 5; i++)
            {

                Thread.Sleep(500);
                Console.WriteLine(" ——task2 状态—{0}", task2.Status);
            }

            cts.Cancel();
            for (int i = 0; i < 5; i++)
            {
                Thread.Sleep(500); 
                Console.WriteLine(" ——task2 状态—{0}", task2.Status);

            }
            Console.WriteLine(" ——任务Task 运行结果—{0}", task2.Result);
            Thread.Sleep(2000);      
            Console.Read(); 

        }
 

        private static int RunTask(string name,int seconds,CancellationToken token)
        {      

            Console.WriteLine("Task {0}  运行在线程={1}中,是否在线程池 :{2}",name,
Thread.CurrentThread.ManagedThreadId,Thread.CurrentThread.IsThreadPoolThread);
for (int i = 0; i < seconds; i++) { Thread.Sleep(TimeSpan.FromSeconds(1)); if (token.IsCancellationRequested) { //取消操作,返回-1; return -1; } } return 42 * seconds; } } }

 

2.程序运行结果如下图。


      首先我们来看task1的创建代码,我们给底层任务传递一次取消标志,然后给任务的构造函数又传递了一次。

      那为什么要传递两次取消标志呢?

      因为如果在task实际启动之前取消它,则TPL的底层有责任处理这个取消操作。经过TPL底层处理过取消操作的task,如果再次启动,则会抛出异常。如下图。

 

 

         然后需要我们自己写代码处理取消操作,在取消操作之后,任务的状态仍然是RanToCompletion,从TPL来角度来讲,这个task已经完成。

 

七、   处理task中的异常

          通过此示例我们学习如何在task中抛出不同情况的异常,以及如何获取这些异常信息。

 1.程序代码如下:

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

namespace ThreadTPLDemo
{

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(" 处理Task中的异常信息。。。。。");
            try
            {
                var task1 = Task.Run(() => RunTask("任务 1", 2));

                int result = task1.Result;
                Console.WriteLine(" ——task1 状态—{0}---值=={1}", task1.Status,result);
            }
            catch (Exception ex)
            {

                Console.WriteLine(" ——task1 错误信息—{0};innerException--{1}", ex.Message,
ex.InnerException==null?string.Empty:ex.InnerException.Message); } Console.WriteLine(" ——————————————————————"); try { var task2 = Task.Run(() => RunTask(
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Spring学习之路 下一篇序列化和反序列化

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目