最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c# Task任務(wù)的取消方式

 更新時(shí)間:2024年12月31日 08:57:11   作者:皮皮君  
文章介紹了如何在C#中使用CancellationTokenSource和CancellationToken來取消任務(wù),通過Task.Run方法和CancellationToken參數(shù),可以控制任務(wù)的執(zhí)行,并在需要時(shí)取消它們,文章還討論了CancellationToken參數(shù)的重要性

Task任務(wù)的取消

c# 任務(wù)的取消,需要用到CancellationTokenSource類,CancellationToken結(jié)構(gòu)體。

注意:CancellationTokenSource是class類型,而CancellationToken是struct結(jié)構(gòu)體。

任務(wù)內(nèi)部"監(jiān)聽"CancellationToken方法

任務(wù)的內(nèi)部在合適的時(shí)候不停地調(diào)用CancellationToken的ThrowIfCancellationRequested()方法,這個(gè)函數(shù)會(huì)拋出一個(gè)叫做OperationCanceledException的異常,它的實(shí)現(xiàn)(微軟開源代碼)如下:

        public void ThrowIfCancellationRequested()
        {
            if (IsCancellationRequested) 
                ThrowOperationCanceledException();
        }

下面的列子通過Task.Run產(chǎn)生了一個(gè)任務(wù)。Task任務(wù)的內(nèi)部正式通過拋出OperationCanceledException異常達(dá)到被取消的目的。而任務(wù)的外部則是通過調(diào)用CancellationTokenSource實(shí)例的Cancel()方法來觸發(fā)取消的動(dòng)作的。

下面的例子是一個(gè)取消Task任務(wù)的例子

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var tokenSource2 = new CancellationTokenSource();
        CancellationToken ct = tokenSource2.Token;
        var tokenSource3 = new CancellationTokenSource();

        var task = Task.Run(() =>
        {
            // Were we already canceled?
            ct.ThrowIfCancellationRequested();
            
            bool moreToDo = true;
            while (moreToDo)
            {
                // Poll on this property if you have to do
                // other cleanup before throwing.
                // Clean up here, then...
                if(ct.IsCancellationRequested)
                {
                    ct.ThrowIfCancellationRequested();
                }
            }
        },tokenSource2.Token); // Pass same token to Task.Run.

        Thread.Sleep(5000);
        tokenSource2.Cancel();

        // Just continue on this thread, or await with try-catch:
        try
        {
            await task;
        }
        catch (OperationCanceledException e)
        {
            Console.WriteLine($"{nameof(OperationCanceledException)} thrown with message: {e.Message}");
            bool eqs = e.CancellationToken.Equals(tokenSource3.Token);
            System.Console.WriteLine($"Equals' result: {eqs}.");
            System.Console.WriteLine($"Task's status: {task.Status}");
        }
        catch (Exception ex)
        {
            System.Console.WriteLine(ex.Message);
        }
        finally
        {
            tokenSource2.Dispose();
        }

        Console.ReadKey();
    }
}
/*
The operation was canceled.
OperationCanceledException thrown with message: The operation was canceled.
Equals' result: False.
Task's status: Canceled
*/

這個(gè)例子中我們在Task的外部創(chuàng)建了2個(gè)CancellationTokenSource實(shí)例,因?yàn)镃ancellationTokenSource類包含一個(gè)CancellationToken類的屬性Token,這也就意味著例子當(dāng)中包含了兩個(gè)CancellationToken實(shí)例。

ThrowIfCancellationRequested()方法會(huì)把調(diào)用它的CancellationToken實(shí)例也作為參數(shù)一起攜帶拋出。

因此catch塊參數(shù)e中包含的是tokenSource2.Token,因此它與tokenSource3.Token進(jìn)行相等比較輸出一定是false。

又因?yàn)門ask.Run()方法中傳入的第二個(gè)參數(shù)也是tokenSource2.Token,Task核心框架內(nèi)部會(huì)比較OperationCanceledException異常中攜帶的CancellationToken實(shí)例和Task.Run()方法中傳入的CancellationToken實(shí)例,如果兩者是一樣的,則Task的status狀態(tài)設(shè)為Canceled,表示成功取消;如果兩者不一樣,Task任務(wù)仍然會(huì)退出,但是Task的status狀態(tài)設(shè)為Faulted,表示出錯(cuò)。

如果將第29行改為:

},tokenSource3.Token); // Pass same token to Task.Run.

則,結(jié)果輸出如下:

OperationCanceledException thrown with message: The operation was canceled.
Equals' result: False.
Task's status: Faulted

看起來,Task任務(wù)也被取消了,但是實(shí)際上是由于出錯(cuò)而退出。因此,Task.Run的第二個(gè)參數(shù)可以用來確保內(nèi)部實(shí)際引發(fā)取消異常的CancellationToken實(shí)例和Task.Run傳入的CancellationToken實(shí)例要一致才能成功取消,否則框架會(huì)誤認(rèn)為你是誤操作而導(dǎo)致退出的。因此,Task.Run的CancellationToken參數(shù)是為了更加安全。

如果將29行改為不帶CancellationToken參數(shù)的重載函數(shù),那么返回的也是一樣的Faulted結(jié)果。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#Url操作類封裝、仿Node.Js中的Url模塊實(shí)例

    C#Url操作類封裝、仿Node.Js中的Url模塊實(shí)例

    這篇文章主要介紹了C#Url操作類封裝、仿Node.Js中的Url模塊,實(shí)例分析了C#Url操作類封裝的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-10-10
  • 在C#中List集合使用First()方法獲取第一個(gè)元素的操作

    在C#中List集合使用First()方法獲取第一個(gè)元素的操作

    這篇文章主要介紹了在C#中List集合使用First()方法獲取第一個(gè)元素的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C#實(shí)現(xiàn)簡易灰度圖和酷炫HeatMap熱力圖winform(附DEMO)

    C#實(shí)現(xiàn)簡易灰度圖和酷炫HeatMap熱力圖winform(附DEMO)

    本文主要介紹了C#實(shí)現(xiàn)簡易灰度圖和酷炫HeatMap熱力圖winform(附DEMO),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C#實(shí)現(xiàn)PDF文件添加圖片背景

    C#實(shí)現(xiàn)PDF文件添加圖片背景

    這篇文章主要介紹了C#實(shí)現(xiàn)PDF文件添加圖片背景的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • C#?操作Windows注冊表的實(shí)現(xiàn)方法

    C#?操作Windows注冊表的實(shí)現(xiàn)方法

    本文主要介紹了C#?操作Windows注冊表的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • C#中值類型和引用類型常見錯(cuò)誤示例小結(jié)

    C#中值類型和引用類型常見錯(cuò)誤示例小結(jié)

    本文總結(jié)了C#中值類型與引用類型常見錯(cuò)誤,包括錯(cuò)誤假設(shè)、未初始化、比較方式、數(shù)組操作、字符串處理及out/ref參數(shù)使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-06-06
  • 淺談熟悉C#如何轉(zhuǎn)TypeScript

    淺談熟悉C#如何轉(zhuǎn)TypeScript

    本文主要介紹了淺談熟悉C#如何轉(zhuǎn)TypeScript,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-05-05
  • 利用C#驗(yàn)證哥德巴赫猜想的示例代碼

    利用C#驗(yàn)證哥德巴赫猜想的示例代碼

    哥德巴赫猜想(Goldbach’s?Conjecture)是數(shù)學(xué)領(lǐng)域的一個(gè)著名猜想,大致內(nèi)容為任何一個(gè)大于2的偶數(shù)都可以表示為兩個(gè)質(zhì)數(shù)之和,下面我們就來看看如何利用C#驗(yàn)證這一猜想呢
    2024-03-03
  • c#對XML文檔的創(chuàng)建與增刪改查的示例代碼

    c#對XML文檔的創(chuàng)建與增刪改查的示例代碼

    這篇文章主要介紹了c#對XML文檔的創(chuàng)建與增刪改查的示例代碼,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 解決WPF繪制矢量圖形模糊的問題

    解決WPF繪制矢量圖形模糊的問題

    這篇文章介紹了WPF繪制矢量圖形模糊問題的解決方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06

最新評論

车险| 莆田市| 天水市| 东兰县| 新源县| 河津市| 百色市| 张家口市| 沙雅县| 社旗县| 定州市| 通榆县| 北海市| 英吉沙县| 房产| 广丰县| 抚州市| 张北县| 瑞丽市| 和林格尔县| 牟定县| 博罗县| 新邵县| 福海县| 咸宁市| 榆社县| 明光市| 九龙县| 丰台区| 崇明县| 乌什县| 鄂伦春自治旗| 大同市| 长乐市| 农安县| 北宁市| 兴仁县| 闵行区| 山东| 德格县| 巴南区|