返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#多线程之取消架构介绍
  • 760
分享到

C#多线程之取消架构介绍

2024-04-02 19:04:59 760人浏览 泡泡鱼
摘要

.net 4.5 中包含取消架构,允许以标准方式取消长时间运行的任务。每个阻塞调用都应支持这种机制。但目前,并不是所有阻塞调用都实现了这个新技术。已经实现了这种机制的技术有任务(ht

.net 4.5 中包含取消架构,允许以标准方式取消长时间运行的任务。每个阻塞调用都应支持这种机制。但目前,并不是所有阻塞调用都实现了这个新技术。已经实现了这种机制的技术有任务(https://www.jb51.net/article/244285.htm),并发集合类(Https://www.jb51.net/article/244141.htm),并行LINQ(https://www.jb51.net/article/244216.htm)和几种同步机制。
取消架构基于协作行为,它不是强制的。长时间运行的任务会检查它是否被取消,并返回控制权。
支持取消的方法接受一个CancellationToken参数。这个类定义了IsCancellationRequested属性,其中长时间运行的操作可以检查它是否应终止。使用ReGISter()方法注册一个将在取消此 System.Threading.CancellationToken 时调用的委托。它在调用Cancel()方法取消操作时调用。

1.Parallel.For()方法的取消

Parallel类提供了For()方法的重载版本,在重载版本中,可以传递ParallelOptions类型的参数。使用ParallelOptions类型,可以传递一个CancellationToken参数。CancellationToken参数通过创建CancellationTokenSource来生成。由于CancellationTokenSource实现了ICancelableOperation接口,因此可以用CancellationToken注册,并允许使用Cancle(),CancleAfter()等方法取消操作。
示例:

    static void CancelParallelFor()
        {
            var cts = new CancellationTokenSource();
            cts.Token.Register( ()=> Console.WriteLine("token canceled!"));

            cts.CancelAfter(1000);

            try
            {
                ParallelLoopResult plr =
                    Parallel.For(0, 100, new ParallelOptions { CancellationToken = cts.Token },
                    x => {
                        Console.WriteLine("loop {0} started", x);
                        Thread.Sleep(1000);
                        Console.WriteLine("loop {0} fininshed!", x);
                    });
            }
            catch (OperationCanceledException ex)
            {
                Console.WriteLine(ex.Message);

            }
        }

输出:

在For循环的实现代码中,Parallel类验证CancellationToken的结果,并取消操作。一旦取消操作,For()方法就抛出一个OperationCanceledException类型的异常。
由输出可看出,当取消操作时,已启动的操作允许完成,因为取消操作总是以协作方式进行,以避免在取消迭代操作的中间泄露资源。

2.任务的取消

任务的取消类似Parallel.For()方法的取消。首先,创建一个CancellationTokenSource。如果只需要一个取消标记,可以访问Task.Factory.CancellationToken,以使用默认的取消标记。任务通过TaskFactory对象接受取消标记。在构造函数中,把取消标记赋予TaskFactory。这个取消标记又任务用于检查CancellationToken的IsCancellationRequested属性,以确定是否请求了取消。
示例:

    static void CancelTask()
        {
            var cts = new CancellationTokenSource();

            cts.Token.Register(() => Console.WriteLine("task cancelled!"));

            cts.CancelAfter(2000);
            


            try
            {
                Task t = Task.Run(() =>
                {
                    CancellationToken token = cts.Token;
                    Console.WriteLine("task stared!");
                    for (int i = 0; i < 20; i++)
                    {
                        Thread.Sleep(500);
                        if (cts.IsCancellationRequested)
                        {
                            Console.WriteLine("cancelled!");
                            token.ThrowIfCancellationRequested();//抛出异常
                            break;
                        }
                        Console.WriteLine("in loop!");
                    }
                }, cts.Token);
                t.Wait();
            }
            catch (AggregateException ex)
            {
                Console.WriteLine("exception:{0},{1}",ex.GetType().Name,ex.Message);
                foreach (var innerEx in ex.InnerExceptions)
                {
                    Console.WriteLine("exception:{0},{1}", ex.InnerException.GetType().Name, ex.InnerException.Message);
                }
            }
        }

输出:

到此这篇关于C#多线程之取消架构的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#多线程之取消架构介绍

本文链接: https://lsjlt.com/news/145808.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#多线程之取消架构介绍
    .NET 4.5 中包含取消架构,允许以标准方式取消长时间运行的任务。每个阻塞调用都应支持这种机制。但目前,并不是所有阻塞调用都实现了这个新技术。已经实现了这种机制的技术有任务(ht...
    99+
    2024-04-02
  • C# 使用CancellationTokenSource取消多线程
    目录几点关键问题解释:同时取消多个线程:有时间我们在使用多线程的时候,需要取消线程的执行,可以使用CancellationTokenSource来取消对Task开辟多线程的取消 如下...
    99+
    2024-04-02
  • C++之openFrameworks框架介绍
    目录0x00 openFrameworks 介绍0x01 开启 oF 之旅0x02 oF 文件结构0x03 图形基础0x04 使用 ...
    99+
    2023-05-19
    C++ openFrameworks框架 C++框架 C++ openFrameworks
  • java多线程之Balking模式介绍
    Balk有拒绝,阻碍的意思。如果现在不适合执行这个操作,或者没必要执行这个操作,就停止处理,直接返回。这就是Balking模式。 Balking 模式可以和Guarded Suspe...
    99+
    2024-04-02
  • Docker镜像多架构构建介绍
    前言: 目前arm系统越来越常见,对镜像的多架构需求也越来越大。对于同一个镜像,最简单的办法就是在amd64或arm机器上build后通过不同的tag进行区分,比如 nginx:v1...
    99+
    2024-04-02
  • 多线程爬虫介绍
    一个进程里只有一个线程,我们称之为单线程爬虫。单线程爬虫每次只访问一个页面,不能充分利用电脑的网络带宽。一个页面最多也就几百KB,所以爬虫在爬取一个页面的时候,多出来的网速就浪费掉了。 而如果我们可以让爬虫同时访问10个页面,就相当于我们...
    99+
    2023-01-30
    爬虫 多线程
  • Java多线程之FutureTask的介绍及使用
    目录一、FutureTask的理解二、FutureTask类图三、FutureTask类中常用方法四、FutureTask类的使用示例一、FutureTask的理解 FutureTa...
    99+
    2024-04-02
  • C#线程控制介绍
    这篇文章主要讲解了“C#线程控制介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#线程控制介绍”吧!在C#中,C#线程控制是如何开始的呢?线程入口是通过ThreadStart代理(del...
    99+
    2023-06-17
  • python多进程和多线程介绍
    目录一、什么是进程和线程 二、多进程和多线程 三、python中的多进程和多线程1、多进程2、多线程一、什么是进程和线程  进程是分配资源的最小单位,线...
    99+
    2024-04-02
  • C#单例模式与多线程用法介绍
    一、单例模式 我们先来看看两种创建单例模式的示例代码。 1、饿汉式  饿汉式创建单例模式是在程序里面直接初始化了一个对象实例: class Good { /// &...
    99+
    2024-04-02
  • C#多线程死锁介绍与案例代码
    一、死锁简介 在多道程序设计环境下,多个进程可能竞争一定数量的资源,。一个进程申请资源,如果资源不可用,那么进程进入等待状态。如果所申请的资源被其他等待进程占有,那么该等待的进程有可...
    99+
    2024-04-02
  • C#中异步和多线程的区别介绍
    一、区别和联系 异步和多线程有什么区别?其实,异步是目的,而多线程是实现这个目的的方法。异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作就没有必要异步了),可以继...
    99+
    2024-04-02
  • C#线程的简单介绍
    本篇内容介绍了“C#线程的简单介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#线程是什么呢?在操作系统中一个进程至少要包含一个线程,然...
    99+
    2023-06-17
  • C#多线程之线程锁
    目录一、Mutex类二、Mutex的用途三、Semaphore信号量1、简介2、初始化3、WaitOne()和Release()四、Monitor类典型的生产者与消费者实例五、Loc...
    99+
    2024-04-02
  • Dubbo框架线程池使用介绍
    目录1、Dubbo已有线程池2、自定义线程池1、Dubbo已有线程池 dubbo在使用时,都是通过创建真实的业务线程池进行操作的。目前已知的线程池模型有两个和java中的相互对应: ...
    99+
    2024-04-02
  • shell 多线程介绍与举例
    在Shell脚本中实现多线程通常可以使用以下几种方式: 后台执行:在Shell脚本中,你可以使用&符号将某个命令放在后台执行,这样可以同时执行多个命令,达到多线程的效果。例如: #!/bin/bashcommand1 &command2 &...
    99+
    2023-08-21
    linux bash 服务器
  • C/S架构学习之多线程实现TCP并发服务器
    并发概念:并发是指两个或多个事件在同一时间间隔发生;多线程实现TCP并发服务器的实现流程:一、创建套接字(socket函数):通信域选择IPV4网络协议、套接字类型选择流式; int sockfd =...
    99+
    2023-10-24
    c语言 架构 学习 linux tcp/ip 多线程 并发服务器
  • B/S与C/S架构的区别介绍
    1.系统架构包括哪些形式? C/S架构 B/S架构 2.什么是C/S架构? 说白了就是客户端/服务端,我们需要安装特定的客户端软卷,例如:QQ。 C/S架构的...
    99+
    2024-04-02
  • java 中多线程生产者消费者问题详细介绍
    java 中多线程生产者消费者问题前言:一般面试喜欢问些线程的问题,较基础的问题无非就是死锁,生产者消费者问题,线程同步等等,在前面的文章有写过死锁,这里就说下多生产多消费的问题了import java.util.concurrent.lo...
    99+
    2023-05-31
    java 多线程 ava
  • C#多线程之线程同步
    一、前言 我们先来看下面一个例子: using System; using System.Threading; namespace ThreadSynchDemo { cl...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作