返回顶部
首页 > 资讯 > 精选 >.Net如何使用Cancellation Framework取消并行任务
  • 480
分享到

.Net如何使用Cancellation Framework取消并行任务

2023-07-02 10:07:15 480人浏览 安东尼
摘要

本篇内容介绍了“.net如何使用Cancellation Framework取消并行任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所

本篇内容介绍了“.net如何使用Cancellation Framework取消并行任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在.net 4.0中,引入了一个新的类CancellationToken,这个类基本上集成了我们各种常用的取消方式,在并发任务中非常有用。

同步模式下的取消:

一种比较常见的需要支持取消功能的的是一些比较耗时的分段操作:如视频转换,网络下载等,这种方式下的取消机制如下:

  • 建立一个标记位,表示该操作是否已经取消

  • UI线程在获取到取消事件后,置标记位为true

  • 耗时的操作线程里,没进行一小段操作之后查询该标记位,如果为true则主动退出。

使用方式如下:

    EventHandler externalEvent;    void Example1()    {        CancellationTokenSource cts = new CancellationTokenSource();        externalEvent +=         (sender, obj) => { cts.Cancel(); }; //wire up an external requester         try        {            int val = LongRunningFunc(cts.Token);        }        catch (OperationCanceledException)        {            //cleanup after cancellation if required...         }    }    private static int LongRunningFunc(CancellationToken token)    {        int total = 0;        for (int i = 0; i < 1000; i++)        {            for (int j = 0; j < 1000; j++)            {                total++;            }            if (token.IsCancellationRequested)            { // observe cancellation                 throw new OperationCanceledException(token); // acknowledge cancellation             }        }        return total;    }

异步模式下的取消

另外一种常见的方式是在一些异步操作中,往往不能主动释放,只能等待异步操作回调的时候才能操作结果。此时一般取消方法如下:

  • 任务线程注册异步操作完成的回调函数,开始异步操作。

  • UI线程接受取消指令,置取消标记位,并主动执行回调函数

  • 回调函数中通过取消标记位判断该任务是已经完成还是被取消的,并执行相关析构操作。

使用方式如下:

    void BlockinGoperation(CancellationToken token)    {        ManualResetEvent mre = new ManualResetEvent(false);        //reGISter a callback that will set the MRE         CancellationTokenRegistration registration =         token.Register(() => mre.Set());        using (registration)        {            mre.WaitOne();            if (token.IsCancellationRequested) //did cancellation wake us?                 throw new OperationCanceledException(token);        } //dispose the registration, which perfORMs the deregisteration.     }

这里我们通过CancellationToken注册了一个回调方法以通知任务等待线程,也可以以我们经常使用的WaitHandle的那样的方式使用。

    void Wait(WaitHandle wh, CancellationToken token)    {        WaitHandle.WaitAny(new[] { wh, token.WaitHandle });        if (token.IsCancellationRequested) //did cancellation wake us?             throw new OperationCanceledException(token);    }

高级应用

由于例子比较简单,这里就只列举一下代码,不多介绍了。

一个CancellationToken对应多个任务

    void Example4()    {        CancellationTokenSource cts = new CancellationTokenSource();        Func1(cts.Token);        Func2(cts.Token);        Func3(cts.Token);        //...         cts.Cancel(); // all listeners see the same cancellation request.     }

一个任务对应多个CancellationToken

    void LinkingExample(CancellationToken ct1, CancellationToken ct2)    {        CancellationTokenSource linkedCTS =        CancellationTokenSource.CreateLinkedTokenSource(ct1, ct2);        try        {            SlowFunc(linkedCTS.Token);        }        catch (OperationCanceledException oce)        {            if (ct1.IsCancellationRequested)            {                // ...             }            else if (ct2.IsCancellationRequested)            {                // ...             }        }        linkedCTS.Dispose(); // clean up the linking. required.     }

最后我们再来一个并发查询时取消的例子:

    private void RunQuery()    {        int[] data = { 1, 2, 3 };        CancellationTokenSource cts = new CancellationTokenSource();        var query = data.AsParallel()                     .WithCancellation(cts.Token) // token given to library code                      .Select((x) => SlowFunc(x, cts.Token)); // token passed to user code     }    private int SlowFunc(int x, CancellationToken token)     {         int result         while(...)         {             if (token.IsCancellationRequested)             throw new OperationCanceledException(token);             ...         }         return result;     }

“.Net如何使用Cancellation Framework取消并行任务”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: .Net如何使用Cancellation Framework取消并行任务

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

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

猜你喜欢
  • .Net使用Cancellation Framework取消并行任务
    在.net 4.0中,引入了一个新的类CancellationToken,这个类基本上集成了我们各种常用的取消方式,在并发任务中非常有用。 同步模式下的取消: 一种比较常见的需要支持...
    99+
    2024-04-02
  • .Net如何使用Cancellation Framework取消并行任务
    本篇内容介绍了“.Net如何使用Cancellation Framework取消并行任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2023-07-02
  • win11如何取消合并任务栏
    要取消任务栏的合并,您可以按照以下步骤进行操作:1. 右键单击任务栏上的空白区域,然后选择“任务栏设置”。2. 在弹出的设置窗口中,...
    99+
    2023-08-31
    win11
  • 如何理解.NET 4并行编程中Task的取消
    如何理解.NET 4并行编程中Task的取消,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。因为Task是.NET 4并行编程最为核心的一个类,也我们在是在并行编...
    99+
    2023-06-17
  • word如何取消打印任务
    这篇文章主要介绍了word如何取消打印任务的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇word如何取消打印任务文章都会有所收获,下面我们一起来看看吧。首先我们打开word,点击左上角的“打印图标”。 打开后,...
    99+
    2023-07-02
  • 在Go语言中如何处理并发任务取消问题
    在Go语言中处理并发任务取消问题,可以使用context包来管理和取消任务。首先,使用context包创建一个上下文对象,例如:``...
    99+
    2023-10-09
    Go语言
  • 在Go语言中如何处理并发任务取消问题?
    在Go语言中如何处理并发任务取消问题?Go语言作为一门并发编程语言,提供了丰富的并发编程特性,例如goroutine和channel,使得处理并发任务变得非常方便。然而,当涉及到取消并发任务时,我们也需要特殊的机制来保证任务的安全退出。本文...
    99+
    2023-10-22
    Goroutine取消 Context调用 并发任务管理
  • 如何使用Python中的多线程进行任务并发执行
    如何使用Python中的多线程进行任务并发执行多线程是一种常用的并发编程技术,可以提高程序的执行效率。在Python中,使用多线程可以实现任务的并发执行,从而加快程序的运行速度。本文将介绍如何使用Python中的多线程进行任务的并发执行,并...
    99+
    2023-10-22
    并发执行 Python多线程
  • php如何停止重启,取消正在执行的任务调度
    前言:最近出现一个问题,同事误操作,开启了一个任务,找到我问能不能停止,我也是火急火燎查询方法帮忙解决,我觉得有必要做个记录,希望帮到有需要的人 之前我写过Laravel和thinkphp的定时...
    99+
    2023-09-13
    php 开发语言
  • Pandas中怎么使用MultiIndex选择并提取任何行和列
    这篇文章主要介绍“Pandas中怎么使用MultiIndex选择并提取任何行和列”,在日常操作中,相信很多人在Pandas中怎么使用MultiIndex选择并提取任何行和列问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-07-05
  • C#中如何使用异步任务和并行计算技术
    C#中如何使用异步任务和并行计算技术引言:在当今的软件开发中,效率和性能问题是一直被开发者关注的重点。为了提高应用程序的响应速度和完成复杂任务的效率,C#中提供了异步任务和并行计算技术。本文将详细介绍C#中如何使用异步任务和并行计算技术,并...
    99+
    2023-10-22
    C# 异步任务 并行计算
  • 怎么用取消参数使Go net/http服务更灵活
    这篇文章主要讲解了“怎么用取消参数使Go net/http服务更灵活”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用取消参数使Go net/http服务...
    99+
    2024-04-02
  • C#怎么使用Task实现执行并行任务
    这篇“C#怎么使用Task实现执行并行任务”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#怎么使用Task实现执行并行任务...
    99+
    2023-07-05
  • .NET Core如何使用CZGL.SystemInfo库获取主机运行资源
    今天就跟大家聊聊有关.NET Core如何使用CZGL.SystemInfo库获取主机运行资源,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。简介CZGL.SystemInf...
    99+
    2023-06-28
  • 如何使用Go WaitGroup处理并发任务
    在 Go 中使用 `sync.WaitGroup` 来处理并发任务,可以确保在所有任务完成之前等待主程序的执行。下面是一个简单的例子...
    99+
    2023-10-09
    Golang
  • C#任务并行Parellel.For和Parallel.ForEach怎么使用
    这篇文章主要介绍了C#任务并行Parellel.For和Parallel.ForEach怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#任务并行Parellel.For和Parallel.ForEac...
    99+
    2023-07-02
  • 如何使用Systemd和Crontab在Linux系统中实现任务的并行执行
    要在Linux系统中实现任务的并行执行,可以结合使用Systemd和Crontab。下面是使用这两个工具的步骤:1. 创建并行执行的...
    99+
    2023-10-09
    Linux
  • C++并发编程:如何进行线程终止和取消?
    c++++ 中线程终止和取消机制包括:线程终止:std::thread::join() 阻塞当前线程直到目标线程完成执行;std::thread::detach() 从线程管理中分离目标...
    99+
    2024-05-06
    线程 并发编程 c++
  • Golang 函数如何高效处理并行任务
    go 函数中的高效并行任务处理:使用 go 关键字启动并发例程。使用 sync.waitgroup 计数未完成例程的数量。例程完成时调用 wg.done() 递减计数器。主程序使用 wg...
    99+
    2024-04-19
    并发 并行 golang
  • 在Go语言中如何解决并发任务并行执行问题
    在Go语言中,可以使用goroutine和channel来解决并发任务并行执行的问题。首先,使用关键字go来创建一个goroutin...
    99+
    2023-10-09
    Go语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作