1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        .NET Core使用Nito.AsyncEx實現(xiàn)異步鎖

        共 2403字,需瀏覽 5分鐘

         ·

        2021-06-27 09:45

        1、需求描述:

        asp.net core在hangfire定時任務(wù)中,何為任務(wù)并發(fā)執(zhí)行,它代表每一次任務(wù)都必須執(zhí)行完成后,才能開啟下一次執(zhí)行,防止并發(fā)執(zhí)行帶來的問題,即也就是防止重復(fù)執(zhí)行。下次任務(wù)開始一定要等上一次任務(wù)執(zhí)行完成后才進行。


        2、解決辦法:

        們可以通過異步鎖(async lock)來實現(xiàn)執(zhí)行出現(xiàn)并發(fā)的問題。




        3、同步鎖和異步鎖是什么?

        Lock是常用的同步鎖,但是我們無法在Lock的內(nèi)部實現(xiàn)異步調(diào)用,比如我們無法使用await。

        以下面的代碼為例,當(dāng)你在lock內(nèi)部使用await時,VS會報錯提醒。

        最簡單的解決辦法就是使用第三方的庫Nito.AsyncEx??梢酝ㄟ^Nuget安裝。

        通過AsyncLock就可以在鎖的內(nèi)部實現(xiàn)異步操作了。

        樣例代碼如下:

         1 public class AsyncLockDemo
        2 {
        3 //private readonly object _mutex = new object();
        4 private readonly AsyncLock _mutex = new AsyncLock();
        5 private int i = 0;
        6 public void Execute()
        7 {
        8 Console.WriteLine("before call foo1: "+ i);
        9
        10 Foo1().ContinueWith(new Action<Task>(t =>
        11 {
        12 Console.WriteLine("foo1 completed: " + i);
        13 }));
        14
        15 Console.WriteLine("after call foo1: " + i);
        16
        17 Console.WriteLine("before call foo2: " + i);
        18
        19 Foo2().ContinueWith(new Action<Task>(t =>
        20 {
        21 Console.WriteLine("foo2 completed: " + i);
        22 }));
        23
        24 Console.WriteLine("after call foo2: " + i);
        25 }
        26
        27 public async Task Foo1()
        28 {
        29 using (await _mutex.LockAsync())
        30 {
        31 await Task.Delay(TimeSpan.FromSeconds(1));
        32 Console.WriteLine("Foo1 start: " + i);
        33 await DoSomethingAsync(1);
        34 Console.WriteLine("Foo1 end: " + i);
        35 }
        36 }
        37
        38 public async Task Foo2()
        39 {
        40 using (await _mutex.LockAsync())
        41 {
        42 Console.WriteLine("Foo2 start: " + i);
        43 //await Task.Delay(TimeSpan.FromSeconds(1));
        44 await DoSomethingAsync(2);
        45 Console.WriteLine("Foo2 end: " + i);
        46 }
        47 }
        48
        49 private Task DoSomethingAsync(int j)
        50 {
        51 return Task<string>.Run(() =>
        52 {
        53 Thread.Sleep(2000);
        54 i = j;
        55 });
        56 }
        57 }

        運行結(jié)果如下:

         


        文章來源:
        使用Nito.AsyncEx實現(xiàn)異步鎖https://www.cnblogs.com/1zhk/p/5269279.html
        Nito.AsyncEx類庫實現(xiàn)asp.net ashx 一般處理程序 使用async await異步https://www.cnblogs.com/sfissw/p/5318316.html


        騰訊課堂



        網(wǎng)易云課堂


        瀏覽 38
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            69精品人人人 | 萱萱女s调教口水圣水 | 啊啊啊网站 | 淫视频在线观看 | 性妲己一级淫片免费 | 又大又粗又爽又黄少妇毛免费 | 久久久久激情电影 | 欧美群p| 国产剧情一区在线观看 | 九九九无码 |