国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - ASP.NET教程 - .Net中異步任務(wù)的取消和監(jiān)控的具體實現(xiàn)

.Net中異步任務(wù)的取消和監(jiān)控的具體實現(xiàn)

2021-12-18 17:02藍夏 ASP.NET教程

本文主要介紹了.Net中異步任務(wù)的取消和監(jiān)控的具體實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

相關(guān)類型:

  • CancellationTokenSource 主要用來創(chuàng)建或取消令牌
  • CancellationToken 監(jiān)聽令牌狀態(tài),注冊令牌取消事件
  • OperationCanceledException 令牌被取消時拋出的異常,可以由監(jiān)聽者自主決定是否拋出異常

CancellationTokenSource

創(chuàng)建令牌:

?
1
2
3
CancellationTokenSource cts = new CancellationTokenSource()
 
CancellationToken token=cts.Token;

取消釋放令牌:

?
1
cts.Cancel();

CancellationToken

監(jiān)聽令牌取消事件:

?
1
token.Register(() => Console.WriteLine("令牌被取消"));

判斷令牌是否取消

?
1
2
3
4
5
6
7
8
9
//返回一個bool,如果令牌被取消為true
token.IsCancellationRequested
 
//如果token被取消則拋出異常,內(nèi)部實現(xiàn)其實就是判斷IsCancellationRequested
token.ThrowIfCancellationRequested()=>{
 if(token.IsCancellationRequested){
  throw new OperationCanceledException();
 }
}

代碼示例

下面模擬一個文件下載的任務(wù),在未下載完成后下載任務(wù)被取消

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public void Run()
 {
     CancellationTokenSource cts = new CancellationTokenSource();
 
     Task.Run(() =>
              {
                  //等待兩秒后取消,模擬的是用戶主動取消下載任務(wù)
                  Thread.Sleep(2000);
                  cts.Cancel();
              });
 
     try
     {
         var size = DownloadFile(cts.Token);
         Console.WriteLine("文件大小:" + size);
     }
     catch (OperationCanceledException)
     {
         Console.WriteLine("下載失敗");
     }finally{
         cts.Dispose();
     }
     Thread.Sleep(2000);
 }
 
 
/// <summary>
/// 模擬下載文件,下載文件需要五秒
/// </summary>
/// <returns></returns>
public int DownloadFile(CancellationToken token)
{
    token.Register(() =>
                   {
                       System.Console.WriteLine("監(jiān)聽到取消事件");
                   });
 
    Console.WriteLine("開始下載文件");
    for (int i = 0; i < 5; i++)
    {
        token.ThrowIfCancellationRequested();
        Console.WriteLine(i.ToString());
        Thread.Sleep(1000);
    }
    Console.WriteLine("文件下載完成");
    return 100;
}

輸出結(jié)果:

開始下載文件
0
1
監(jiān)聽到取消事件
下載失敗

思考

為什么要將CancellationToken和CancellationTokenSource分為兩個類呢,直接一個CancellationToken又可以取消又可以判斷狀態(tài)注冊啥的不是更好,更方便?

其實每種類的設(shè)計和實現(xiàn)都可以有很多不同的策略,CTS和CT從這個兩個類提供的為數(shù)不多的公開方法中就可以看出,CTS用來控制Token的生成和取消等生命周期狀態(tài),CT只能用來監(jiān)聽和判斷,無法對Token的狀態(tài)進行改變。

所以這種設(shè)計的目的就是關(guān)注點分離。限制了CT的功能,避免Token在傳遞過程中被不可控的因素取消造成混亂。

關(guān)聯(lián)令牌

繼續(xù)拿上面的示例來說,示例中實現(xiàn)了從外部控制文件下載功能的終止。

如果要給文件下載功能加一個超時時間的限制,此時可以增加一個控制超時時間的token,將外部傳來的token和內(nèi)部token 關(guān)聯(lián)起來變?yōu)橐粋€token

只需要將DownloadFile()函數(shù)做如下改造即可

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public int DownloadFile(CancellationToken externalToken)
        {
            //通過構(gòu)造函數(shù)設(shè)置TokenSource一秒之后調(diào)用Cancel()函數(shù)
            var timeOutToken = new CancellationTokenSource(new TimeSpan(0, 0, 1)).Token;
            using (var linkToken = CancellationTokenSource.CreateLinkedTokenSource(externalToken, timeOutToken))
            {
                Console.WriteLine("開始下載文件");
                for (int i = 0; i < 5; i++)
                {
                    linkToken.Token.ThrowIfCancellationRequested();
                    Console.WriteLine(i.ToString());
                    Thread.Sleep(1000);
                }
                Console.WriteLine("文件下載完成");
                return 100;
            }
        }

此時不論是externalToken取消,或是timeOutToken取消,都會觸發(fā)linkToken的取消事件

CancellationChangeToken

CancellationChangeToken主要用來監(jiān)測目標(biāo)變化,需配合ChangeToken使用。從功能場景來說,其實ChangeToken的功能和事件似乎差不多,當(dāng)監(jiān)控的目標(biāo)發(fā)生了變化,監(jiān)聽者去做一系列的事情。

但是事件的話,監(jiān)聽者需要知道目標(biāo)的存在,就是如果A要注冊B的事件,A是要依賴B的。

CancellationChangeToken是基于CancellationToken來實現(xiàn)的,可以做到依賴于Token而不直接依賴被監(jiān)聽的類

創(chuàng)建CancellationChangeToken:

?
1
new CancellationChangeToken(new CancellationTokenSource().Token)

監(jiān)聽Token變動

?
1
new CancellationChangeToken(cts.Token).RegisterChangeCallback(obj => Console.WriteLine("token 變動"), null);

CancellationChangeToken只是把CancellationToken包裝了一層。RegisterChangeCallback最終也是監(jiān)聽的CancellationToken的IsCancellationRequested狀態(tài)。

所以就有個問題,代碼寫到這里,并不能實現(xiàn)每次內(nèi)部變動都觸發(fā)回調(diào)事件。

因為CT只會Cancel一次,對應(yīng)的監(jiān)聽也會執(zhí)行一次。無法實現(xiàn)多次監(jiān)聽

為了實現(xiàn)變化的持續(xù)監(jiān)聽,需要做兩個操作

  • 讓Token在Cancel之后重新初始化
  • 每次Cancel回調(diào)之后重新監(jiān)聽新的Token

先上代碼,下面的代碼實現(xiàn)了每次時間變動都會通知展示面板刷新時間的顯示

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public void Run()
{
    var bjDate = new BeijingDate();
    DisplayDate(bjDate.GetChangeToken, bjDate.GetDate);
    Thread.Sleep(50000);
}
 
public void DisplayDate(Func<IChangeToken> getChangeToken, Func<DateTime> getDate)
{
    ChangeToken.OnChange(getChangeToken, () => Console.WriteLine("當(dāng)前時間:" + getDate()));
}
 
public class BeijingDate
{
    private CancellationTokenSource cts;
    private DateTime date;
    public BeijingDate()
    {
        cts = new CancellationTokenSource();
        var timer = new Timer(TimeChange, null, 0, 1000);
    }
 
    private void TimeChange(object state)
    {
        date = DateTime.Now;
        var old = cts;
        cts = new CancellationTokenSource();
        old.Cancel();
    }
 
    public DateTime GetDate() => date;
    public CancellationChangeToken GetChangeToken()
    {
        return new CancellationChangeToken(cts.Token);
    }
}

在TimeChange()中修改了時間,重置了Token并將舊的Token取消

在DisplayDate中用ChangeToken.OnChange獲取對應(yīng)的Token并監(jiān)聽

實現(xiàn)了DisplayData函數(shù)和BeijingDate這個類的解耦

ChangeToken.OnChange 這個函數(shù)接收兩個參數(shù),一個是獲取Token的委托,一個是Token取消事件的響應(yīng)委托。

每次在處理完Token的取消事件后,他會重新調(diào)用第一個委托獲取Token,而此時我們已經(jīng)生成了新的Token,最終實現(xiàn)了持續(xù)監(jiān)控

到此這篇關(guān)于.Net中異步任務(wù)的取消和監(jiān)控的文章就介紹到這了,更多相關(guān).Net中異步任務(wù)的取消和監(jiān)控內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/bluesummer/p/15219701.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩中文字幕在线 | 国产精品久久久久无码av | 久久久91精品国产一区二区三区 | 探花av在线| 欧美视频在线一区 | 日韩欧美一区二区三区 | www.亚洲精品 | 九九综合九九 | 欧美亚洲国产日韩 | 成人在线视频观看 | 精品国产乱码久久久久久1区2区 | 中文字幕一区二区三区四区不卡 | 国产精品久久久久久久一区探花 | 欧美日韩一 | 久久精品成人一区二区三区蜜臀 | 看欧美一级片 | 精久久久| 黄色在线免费观看视频网站 | 色网在线观看 | 青青久视频 | 欧美日韩网站 | 亚洲精品久久久久一区二区三区 | 日本少妇bbbb爽爽bbb美 | jizzhd中国| 亚洲艹 | 亚洲狼人 | 久久久99久久久国产自输拍 | 精品无人乱码一区二区三区 | 午夜在线视频 | 欧美日韩高清在线一区 | av瑟瑟 | 一区二区三区高清不卡 | 成人在线观看av | 欧美一区免费 | 国产剧情一区二区 | 国产欧美日韩综合精品一区二区 | 日本理伦片午夜理伦片 | 日韩精品一区二区三区 | 91日韩精品一区二区三区 | 中文字幕免费看 | 国产99久久精品一区二区永久免费 |