(精華)2020年12月23日 .NET Core 多線程底層詳解(異步發展史)

      網友投稿 755 2025-03-31

      第一階段

      線程有限多余的會固化到磁盤

      public static class Sample01 { public static void Send(IPAddress address, int port) { var tcp = new TcpClient(); try { //C10K,10K個客戶端,4G,10M,上 tcp.Connect(address, port); tcp.GetStream().Write(Encoding.ASCII.GetBytes("Hello")); } catch (Exception e) { Console.WriteLine(e); throw; } finally { tcp.Close(); } } }

      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 Sample02 { public static void Send(IPAddress address, int port) { var client = new TcpClient(); // 開始異步連接 client.BeginConnect(address, port, ar => { // 無論成功失敗都會調用這個回調 try { client.EndConnect(ar); } catch (Exception e) { Console.WriteLine(e); client.Close(); } var bytes = Encoding.ASCII.GetBytes("Hello"); var stream = client.GetStream(); stream.BeginWrite(bytes, 0, bytes.Length, result => { try { stream.EndWrite(result); } catch (Exception e) { Console.WriteLine(e); } finally { client.Close(); } },null); },null); } }

      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

      第三階段

      Task TPL 任務并行庫分離了異步操作與注冊回調的處理,async和await

      第一種,任務中執行指定的委托(運行時內部的線程池中運行),Run和Factory.StartNew

      public class TplSample { public static Task SendAsync(IPAddress address, int port) { var client = new TcpClient(); // 異步連接 var task = client.ConnectAsync(address, port); var a = new TaskFactory(); // 異步發送數據 var task1 = task.ContinueWith(t => { var bytes = Encoding.ASCII.GetBytes("Hello"); var stream = client.GetStream(); // 返回一個新的task // 這里會產生Task嵌套 // 在外部使用Unwrap方法解包 return stream.WriteAsync(bytes, 0, bytes.Length); }).Unwrap(); // 異步處理發送結果 var task2 = task1.ContinueWith(t => { if (t.IsFaulted) { // 失敗 } else if (t.IsCompleted) { // 完成 } client.Close(); }); return task2; } public static void Run(IPAddress address, int port) { // 創建1萬個Task var tasks = new Task[10000]; for (var i = 0; i < tasks.Length; i++) { // SendAsync 本身就是一個異步方法 tasks[i] = SendAsync(address, port); } // 等待所有異步操作執行完成 Task.WaitAll(tasks); } }

      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

      48

      49

      50

      51

      第二種,承諾對象,Promise,將來對象,Future

      public class PromiseSample { public static Task ConnectAsync(TcpClient client,IPAddress address, int port) { // 創建一個承諾對象, var promise = new TaskCompletionSource(); // 獲取將來對象 var future = promise.Task; client.BeginConnect(address, port, ar => { try { client.EndConnect(ar); promise.SetResult(null); } catch (OperationCanceledException) { promise.SetCanceled(); } catch (Exception ex) { promise.SetException(ex); } },null); return future; } }

      1

      2

      3

      4

      5

      6

      7

      (精華)2020年12月23日 .NET Core 多線程底層詳解(異步發展史)

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      task的異步

      public static class ChildTaskSample { public static Task Run() { // 創建一個父任務 var parent = Task.Factory.StartNew(() => { // 創建子任務1 var child1 = Task.Factory.StartNew(() => { // 子任務1 },TaskCreationOptions.AttachedToParent); // 創建子任務2 var child2 = Task.Factory.StartNew(() => { // 子任務2 }, TaskCreationOptions.AttachedToParent); }); // 父任務會等待子任務1和2完成以后在調用回調 // 子任務中發生的異常也會傳遞到父任務的回調中 return parent; } }

      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

      async和await

      public static class Sample06 { // async關鍵字是給編譯器看的,我就要為生產狀態機 public static async Task SendAsync(IPAddress address, int port) { var client = new TcpClient(); try { // 異步連接 await client.ConnectAsync(address, port); // 連接成功后會從這里繼續開始執行 // 失敗時會拋出異常并在下面的catch塊中被捕捉 var bytes = Encoding.ASCII.GetBytes("Hello"); var stream = client.GetStream(); // 異步發送數據 await stream.WriteAsync(bytes, 0, bytes.Length); // 發送成功后會從這里繼續開始執行 // 失敗時同樣會拋出異常,也在下面的catch塊中被捕捉 Console.WriteLine("發送完成"); } catch (Exception e) { Console.WriteLine(e); } finally { client.Close(); } } }

      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

      備注:其他異步

      ValueTask

      從數據庫隨機取一條數據

      先從數據庫隨機獲取100條數據,作為將來100次調用的返回結果,每100次調用只有一次會查詢數據庫,其它99次都是同步完成

      .NET 任務調度 多線程

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

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

      上一篇:RDF 規則
      下一篇:如何在Excel中從日期中刪除時間?
      相關文章
      丰满亚洲大尺度无码无码专线| 亚洲精品中文字幕麻豆| 亚洲六月丁香六月婷婷蜜芽| 亚洲AV无码不卡在线播放| 亚洲国产成人高清在线观看| 国产l精品国产亚洲区在线观看| 亚洲综合无码AV一区二区| 亚洲国产综合精品一区在线播放| heyzo亚洲精品日韩| 国产亚洲精品精品精品| AV激情亚洲男人的天堂国语| 国产精品亚洲lv粉色| 国产天堂亚洲精品| 亚洲国产精品成人久久蜜臀| 亚洲成av人片一区二区三区| 午夜亚洲乱码伦小说区69堂| 亚洲av午夜成人片精品电影| 亚洲精品无码久久毛片| 精品国产人成亚洲区| 亚洲午夜国产精品无码老牛影视| 亚洲区小说区图片区QVOD| 亚洲成色www久久网站夜月| 久久久久亚洲精品无码系列| 蜜芽亚洲av无码精品色午夜| 91亚洲精品麻豆| 久久久久久亚洲精品影院| 亚洲精品无AMM毛片| 一级毛片直播亚洲| 国产午夜亚洲精品理论片不卡| 国产亚洲一区二区在线观看| 亚洲男人天堂av| 亚洲午夜电影在线观看高清 | 亚洲精品美女久久久久99小说| 亚洲国产成人VA在线观看| 亚洲午夜日韩高清一区| 亚洲成A∨人片在线观看不卡| 亚洲视频在线观看免费视频| 亚洲乱码一二三四五六区| 亚洲国产区男人本色在线观看| 亚洲国产成人无码AV在线| 亚洲精品第一国产综合境外资源|