(精華)2020年12月23日 .NET Core 多線程底層詳解(線程本地存儲)

      網友投稿 766 2025-04-06

      一般來說線程都是有自己上下文,變量是不共享的,這就需要線程本地存儲


      public static class TlsSample { [ThreadStatic] public static int a; [ThreadStatic] public static int b; public static void Thread1() { a = 1; b = 2; Console.WriteLine($"a={a} [From Thread1]"); Console.WriteLine($"b={b} [From Thread1]"); } public static void Thread2() { a = 10; b = 20; Console.WriteLine($"a={a} [From Thread2]"); Console.WriteLine($"b={b} [From Thread2]"); } public static void Run() { var thread1 = new Thread(Thread1); var thread2 = new Thread(Thread2); thread1.Start(); thread2.Start(); } }

      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

      public class ThreadLocalSample { public readonly ThreadLocal a = new ThreadLocal(); public readonly ThreadLocal b = new ThreadLocal(); public void Thread1() { a.Value = 1; b.Value = 2; Console.WriteLine($"a={a} [From Thread1]"); Console.WriteLine($"b={b} [From Thread1]"); } public void Thread2() { a.Value = 10; b.Value = 20; Console.WriteLine($"a={a} [From Thread2]"); Console.WriteLine($"b={b} [From Thread2]"); } public void Run() { var thread1 = new Thread(Thread1); var thread2 = new Thread(Thread2); thread1.Start(); thread2.Start(); } }

      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

      異步本地變量AsyncLocal(執行上下文

      public static class Sample07 { private static readonly ThreadLocal ThreadLocal = new ThreadLocal(); private static readonly AsyncLocal AsyncLocal = new AsyncLocal(); public static async Task Run() { ThreadLocal.Value = 10; AsyncLocal.Value = 10; Console.WriteLine($"Tid={Thread.CurrentThread.ManagedThreadId};" + $"ThreadLocal={ThreadLocal.Value};" + $"AsyncLocal={AsyncLocal.Value}"); await Task.Delay(1000); Console.WriteLine($"Tid={Thread.CurrentThread.ManagedThreadId};" + $"ThreadLocal={ThreadLocal.Value};" + $"AsyncLocal={AsyncLocal.Value}"); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      不變性值類型子任務異步變量修改不會變,引用會

      public static class Sample08 { private static readonly AsyncLocal AsyncLocal = new AsyncLocal(); public static async Task ParentTask() { AsyncLocal.Value = 111; Console.WriteLine($"ParentTask Begin:AsyncLocal={AsyncLocal.Value}"); await ChildTask(); Console.WriteLine($"ParentTask End:AsyncLocal={AsyncLocal.Value}"); } public static async Task ChildTask() { Console.WriteLine($"ChildTask Begin:AsyncLocal={AsyncLocal.Value}"); AsyncLocal.Value = 222; await Task.Delay(1000); Console.WriteLine($"ChildTask End:AsyncLocal={AsyncLocal.Value}"); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      禁止捕捉執行上下文,則無法傳遞到其他線程

      public static class Sample11 { private static readonly AsyncLocal AsyncLocal = new AsyncLocal(); public static async Task ParentTask() { AsyncLocal.Value = 111; Console.WriteLine($"ParentTask Begin:AsyncLocal={AsyncLocal.Value}"); // 禁止捕捉執行上下文 var control = ExecutionContext.SuppressFlow(); Task.Delay(100).ContinueWith(task => { Console.WriteLine($"SuppressFlow:AsyncLocal={AsyncLocal.Value}"); }); // 恢復捕捉上下文 control.Undo(); // 捕捉到的執行上下文為null await Task.Delay(100); Console.WriteLine($"Undo:AsyncLocal={AsyncLocal.Value}"); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      (精華)2020年12月23日 .NET Core 多線程底層詳解(線程本地存儲)

      25

      26

      .NET 任務調度

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:24.3%,No.1
      下一篇:11.2.0.4 aix下運行第二個節點root.sh報錯處理
      相關文章
      久久精品国产亚洲av麻豆图片 | 亚洲六月丁香六月婷婷色伊人| 亚洲男人在线无码视频| 亚洲国产精品免费在线观看| 亚洲日本在线看片| 亚洲AV无码欧洲AV无码网站| 国产亚洲一区二区精品| 亚洲日韩小电影在线观看| 亚洲国产精品一区二区九九| 亚洲高清无码在线观看| 亚洲高清无码在线观看| 久久精品国产亚洲AV不卡| 亚洲视频人成在线播放| 久久亚洲中文字幕精品一区四| 亚洲五月午夜免费在线视频| 亚洲精品视频在线看| 国产亚洲精品无码专区| 亚洲情XO亚洲色XO无码| 久久亚洲国产精品一区二区| 亚洲成AV人在线观看天堂无码| 亚洲成av人在线视| 亚洲高清日韩精品第一区 | 亚洲精品久久久久无码AV片软件| 亚洲妇女无套内射精| 国产成人+综合亚洲+天堂| 亚洲av无码乱码在线观看野外| 亚洲人成网站18禁止一区| 一本色道久久综合亚洲精品高清 | 久久狠狠爱亚洲综合影院| 亚洲一区AV无码少妇电影| 亚洲第一se情网站| 亚洲午夜福利精品久久| 亚洲无线观看国产精品| 久久久亚洲欧洲日产国码农村| 久久精品亚洲精品国产色婷| 亚洲乱码一二三四五六区| 午夜在线a亚洲v天堂网2019| 亚洲国产成人久久精品软件| 亚洲国产a级视频| 亚洲人精品午夜射精日韩 | 久久久久久亚洲av无码蜜芽|