日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.Net4.0并行库介绍——Cancellation Framework

發(fā)布時間:2025/3/20 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .Net4.0并行库介绍——Cancellation Framework 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在.net 4.0中,引入了一個新的類CancellationToken,這個類基本上集成了我們各種常用的取消方式,在并發(fā)任務(wù)中非常有用。

同步模式下的取消:

一種比較常見的需要支持取消功能的的是一些比較耗時的分段操作:如視頻轉(zhuǎn)換,網(wǎng)絡(luò)下載等,這種方式下的取消機制如下:

  • 建立一個標(biāo)記位,表示該操作是否已經(jīng)取消
  • UI線程在獲取到取消事件后,置標(biāo)記位為true
  • 耗時的操作線程里,沒進(jìn)行一小段操作之后查詢該標(biāo)記位,如果為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; ????}

    異步模式下的取消

    另外一種常見的方式是在一些異步操作中,往往不能主動釋放,只能等待異步操作回調(diào)的時候才能操作結(jié)果。此時一般取消方法如下:

  • 任務(wù)線程注冊異步操作完成的回調(diào)函數(shù),開始異步操作。
  • UI線程接受取消指令,置取消標(biāo)記位,并主動執(zhí)行回調(diào)函數(shù)
  • 回調(diào)函數(shù)中通過取消標(biāo)記位判斷該任務(wù)是已經(jīng)完成還是被取消的,并執(zhí)行相關(guān)析構(gòu)操作。
  • 使用方式如下:

    ????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注冊了一個回調(diào)方法以通知任務(wù)等待線程,也可以以我們經(jīng)常使用的WaitHandle的那樣的方式使用。

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

    高級應(yīng)用

    由于例子比較簡單,這里就只列舉一下代碼,不多介紹了。

    一個CancellationToken對應(yīng)多個任務(wù)

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

    一個任務(wù)對應(yīng)多個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. ????}

    最后我們再來一個并發(fā)查詢時取消的例子:

    ????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; ????}

    小結(jié)

    .net 4.0中的Cancellation Framework還是非常實用的,通過它可以更有效的簡化及規(guī)范的使用各種取消的操作方式,由于我也只會皮毛,在這里也只是介紹了它的基本用法,在后續(xù)的學(xué)習(xí)和應(yīng)用中將繼續(xù)進(jìn)一步介紹。

    轉(zhuǎn)載于:https://www.cnblogs.com/zjoch/p/3508301.html

    總結(jié)

    以上是生活随笔為你收集整理的.Net4.0并行库介绍——Cancellation Framework的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。