探索Task的取消

2021-10-02 14:25:45 字數 3038 閱讀 2433

我們都知道task.run方法可以傳入乙個cancellationtoken,用於取消。可是有多少人真的去了解過當呼叫cancellationsource.cancel方法時,task是否真的被取消了

我們做個實驗

public

static

async

void

foo(

), source.token)

;await task.

delay

(timespan.

fromseconds(3

)); source.

cancel()

; console.

writeline

("取消任務");

}

建立上述程式,讓乙個task執行5秒後輸出"task執行結束",而在3秒後就進行取消。

令人驚訝的是任務竟然順利執行完成。

為了進一步確認結果,我們新增乙個後續任務,檢視下之前任務的結束狀態

public

static

async

void

foo(

), source.token)

.continuewith

(task =

> console.

writeline

(task.status));

await task.

delay

(timespan.

fromseconds(3

)); source.

cancel()

; console.

writeline

("取消任務");

結果是rantocompletion而不是canceled,這說明任務根本沒有被取消

我們如果不在取消前等待3秒,並且新增任務執行開始日誌

public

static

async

void

foo(

), source.token)

.continuewith

(task =

> console.

writeline

(task.status));

source.

cancel()

; console.

writeline

("取消任務");

}

(…/media/1548577856869.png)]任務有被正常取消了

實際上,當task.run的任務真正開始執行後,呼叫cancellationsource.cancel方法並不能取消任務,或者結束呼叫執行緒。呼叫的方法仍然會順利執行。

那麼帶有cancellationtoken的方法過載有什麼用呢?

1、如第三個例子所示,在任務執行開始之前,呼叫cancel可以直接取消任務,避免額外消耗乙個執行緒

2、當對應的token,在執行體中丟擲operationcanceledexception,(即呼叫cancellationtoken.throwifcancellationrequested())可以將其捕獲,並且將任務狀態置為canceled

public

static

async

void

foo(

),source.token)

.continuewith

(task =

> console.

writeline

(task.status));

await task.

delay

(timespan.

fromseconds(3

)); source.

cancel()

; console.

writeline

("取消任務");

而如果沒有使用這個過載,任務會因未捕獲異常而終止,並非取消

public

static

async

void

foo())

.continuewith

(task =

> console.

writeline

(task.status));

await task.

delay

(timespan.

fromseconds(3

)); source.

cancel()

; console.

writeline

("取消任務");

所以我們為task.run新增了cancellationtoken後仍需要,在方法執行時手動判斷token是否取消

本文會經常更新,請閱讀個人部落格原文: ,以避免陳舊錯誤知識的誤導,同時有更好的閱讀體驗。

Task任務取消

如下 using microsoft.entityframeworkcore using system using system.collections using system.collections.concurrent using system.collections.generic usin...

Task02 資料的探索性分析

賽題概況 比賽要求參賽選手根據給定的資料集,建立模型,二手汽車的交易 來自 ebay kleinanzeigen 報廢的二手車,數量超過 370,000,包含 20 列變數資訊,為了保證 比賽的公平性,將 會從中抽取 10 萬條作為訓練集,5 萬條作為測試集 a,5 萬條作為測試集 b。同時會對名稱...

資料探勘 task2資料探索分析EDA

2.示例 載入各種資料科學以及視覺化庫 載入資料 資料總覽 判斷資料缺失和異常 了解 值的分布 特徵分為類別特徵和數字特徵,並對類別特徵檢視unique分布 數字特徵分析 型別特徵分析 用pandas profiling生成資料報告 import pandas as pd import numpy ...