精華)2020年8月31日 計算機操作系統 IO概念和五種IO模型">(精華)2020年8月31日 計算機操作系統 IO概念和五種IO模型
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
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
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
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小時內刪除侵權內容。