1const n=`--- 2title: C#å¤çº¿ç¨å ¥é¨ 3description: C#å¤çº¿ç¨å¸¸ç¨æä½ 4author: ShenNya 5date: 2024-11-13 17:01:00 +0800 6categories: [CSharp] 7tags: [CSharp, å¤çº¿ç¨, Thread, å¹¶å, å¹¶è¡] 8#pin: true 9math: true 10mermaid: true 11--- 12 13# C#å¤çº¿ç¨å ¥é¨ 14 15## åè¨ 16> 注ï¼Python3.13廿äºGilï¼å·²ç»æ¥æäºçæ£çå¤çº¿ç¨ 17 18å¨ä½¿ç¨Pythonåäºå å¹´ **èåç** å¤çº¿ç¨ä¹åï¼æ³ä½¿ç¨C#è¿è¡çæ£çå¤çº¿ç¨æä½ 19 20é®é¢çèµ·å æ¯éå°äºé«å¹¶ååºæ¯ï¼åæ¶éè¦æ§å¶çº¿ç¨å¯¹å¯ä¸æä»¶IOè¿è¡æä½ï¼äºæ¯å°±æäºè¿ç¯æç« 21 22å¦æä½ æ³æ·±å ¥äºè§£æ´å¤ççº¿ç¨æä½å忥æºå¶ï¼è¯·ç¹[è¿é](/posts/csharp-multi-thread-advance/) 23 24åæåºè¯¥ä¼åä¸ä¸ªå®æï¼~~ä½ä¸æ¯ç°å¨ [Soon(TM)]~~ å·²ç»[åå®äº](/posts/csharp-multi-thread-download-file/) 25 26 27## æç®åçTask 28 29\`\`\`csharp 30using System; 31using System.Threading.Tasks; 32 33class Program 34{ 35 static void Main() 36 { 37 Task.Run(() => DoWork(1)); 38 Task.Run(() => DoWork(2)); 39 } 40 41 static void DoWork(int id) 42 { 43 Console.WriteLine($"{id} is started"); 44 Thread.Sleep(1000); 45 Console.WriteLine($"{id} is done"); 46 } 47} 48\`\`\` 49## 弿¥ 50 51常ç¨äºUI交äºï¼å¤çé¿æ¶ä»»å¡æ¶ä¸ä¼é æçº¿ç¨åæ» 52 53\`\`\`csharp 54using System; 55using System.Net.Http; 56using System.Threading.Tasks; 57 58class Program 59{ 60 static async Task Main() 61 { 62 Console.WriteLine("å¼å§ä¸è½½..."); 63 await DownloadDataAsync(); 64 Console.WriteLine("ä¸è½½å®æ"); 65 } 66 67 static async Task DownloadDataAsync() 68 { 69 using (HttpClient client = new HttpClient()) 70 { 71 string data = await client.GetStringAsync("https://example.com"); // é»å¡çå¾ ä¸è½½å®æ 72 Console.WriteLine(data); 73 } 74 } 75} 76 77\`\`\` 78## å¹¶å 79 80强è°ä»»å¡äº¤æ¿æ§è¡ï¼æ²¡ææ§å¶ä»»å¡å¨åªä¸ªæ ¸å¿ä¸æ§è¡ï¼ä¹ä¸ä¸å®ææä»»å¡é½ä¼åæ¶æ§è¡ 81 82\`\`\`csharp 83using System; 84using System.Collections.Generic; 85using System.Threading.Tasks; 86 87class Program 88{ 89 static async Task Main(string[] args) 90 { 91 List<Task> tasks = new List<Task>(); 92 93 for (int i = 1; i <= 5; i++) 94 { 95 int taskId = i; 96 tasks.Add(Task.Run(() => DoWorkAsync(taskId))); 97 } 98 99 await Task.WhenAll(tasks); 100 101 Console.WriteLine("ææä»»å¡å·²å®æï¼"); 102 } 103 104 static async Task DoWorkAsync(int id) 105 { 106 Console.WriteLine($"ä»»å¡{id}å¼å§"); 107 await Task.Delay(1000 * id); // 模æå¼æ¥æä½ 108 Console.WriteLine($"ä»»å¡{id}宿"); 109 } 110} 111\`\`\` 112æ¯ä¸æ¯æè§å¹¶ååå¹¶è¡å¨ä»£ç ä¸å¾ç¸ä¼¼ï¼ä½ å¯ä»¥å¨[è¿é](#å¹¶è¡å¹¶å弿¥çåºå«)æ¾å°åºå« 113 114## å¹¶è¡ 115 116å åå©ç¨å¤æ ¸CPUï¼ç¡®ä¿å¤ä¸ªä»»å¡è½å¤åæ¶æ§è¡ 117 118> 注ï¼Parallelæ¬èº«æ¯åºäºçº¿ç¨æ± çæ§è¡å·¥å · (åºäºThreadPoolè°åº¦ç®¡ç线ç¨) ï¼ä½ å¯ä»¥å¨[è¿é](#çº¿ç¨æ± )æ¾å°æå ³çº¿ç¨æ± çä¿¡æ¯ 119 120 121\`\`\`csharp 122using System; 123using System.Threading.Tasks; 124 125class Program 126{ 127 static void Main(string[] args) 128 { 129 Console.WriteLine("å¹¶è¡è®¡ç®å¼å§"); 130 131 // ä½¿ç¨ Parallel.For å¹¶è¡è®¡ç® 132 Parallel.For(1, 11, i => 133 { 134 int result = i * i; 135 Console.WriteLine($"æ°å {i} çå¹³æ¹æ¯: {result} (çº¿ç¨ {Task.CurrentId})"); 136 }); 137 138 Console.WriteLine("å¹¶è¡è®¡ç®ç»æ"); 139 } 140} 141 142\`\`\` 143 144æ¯ä¸æ¯æè§å¹¶ååå¹¶è¡å¨ä»£ç ä¸å¾ç¸ä¼¼ï¼ä½ å¯ä»¥å¨[è¿é](#å¹¶è¡å¹¶å弿¥çåºå«)æ¾å°åºå« 145 146## å¹¶è¡ãå¹¶åã弿¥çåºå« 147 148> è¿éæå¼æ¥ä¸èµ·æå°æ¯å 为å¾å¤äººæ¥è§¦å¾å½¢çé¢ç¼ç¨æ¶æ´çæå¼æ¥ï¼èå¹¶ä¸äºè§£ä» 149 150### åºå« 151 152**å¹¶è¡** 153 154å¤ä¸ªä»»å¡çæ£åæ¶æ§è¡ãå¹¶è¡é常éè¦å¤æ ¸å¤ç卿å¤å°è®¡ç®æºãæ¯ä¸ªä»»å¡è¿è¡å¨ç¬ç«çæ ¸å¿æå¤çå¨ä¸ 155 156**å¹¶å** 157 158å¤ä¸ªä»»å¡å¨å䏿¶é´æ®µå äº¤æ¿æ§è¡ãä¾å¦ï¼ä» åæ ¸å¤çä½å¯ä»¥å¨ä¸åä»»å¡ä¹é´å¿«é忢ï¼ç»äººä¸ç§âåæ¶è¿è¡âçæè§ã 159 160**弿¥** 161 162弿¥æ¯ä¸ç§*ç¼ç¨æ¨¡å*ï¼æçæ¯ä»»å¡ä¸éè¦çå¾ å ¶ä»ä»»å¡å®æå°±å¯ä»¥ç»§ç»æ§è¡ã弿¥ä»»å¡é常ä¼å¨çå¾ æä¸ªæä½ï¼å¦ I/O æä½æç½ç»è¯·æ±ï¼å®ææ¶éæ¾æ§å¶æï¼è®©ç¨åºå¯ä»¥å»åå ¶ä»äºæ ï¼çå°æä½å®æååç»§ç» 163 164--- 165 166æç§ç¨åº¦ä¸è¯´ï¼å¼æ¥æ¯å¹¶åçä¸ç§å®ç°æ¹å¼ï¼æè®¤ä¸ºåå å¦ä¸ï¼ 167- 弿¥æ¯ä¸ç§å¹¶å模å 168- 弿¥æ¬è´¨ä¸æ¯ä¸ç§éé»å¡çä»»å¡å¤ç 169- å¹¶å强è°äº¤æ¿è¿è¡ï¼èå¹¶è¡åæ¯åæ¶è¿è¡ï¼å¼æ¥æ¯éè¿éé»å¡çæ¹å¼å®ç°å¹¶åç 170- 并忝ä¸ç§ä»»å¡ç®¡çææ³ï¼å¯ä»¥éè¿å¤çº¿ç¨ãå¤è¿ç¨ãåç¨çæ¹å¼æ¥å®ç°ï¼è弿¥æ¯å ¶ä¸ä¸ç§æ¹å¼ 171 172å æ¤ **å¹¶å â å¹¶è¡**ï¼è **弿¥ â å¹¶å** 173 174ç±æ¤æä»¬å¯ä»¥å¾å°ä¸é¢çè¡¨æ ¼ (ç论ä¸å¼æ¥ä¸åºè¯¥å¨è¡¨æ ¼é)ï¼ 175 176| æ¹å¼ | ç±»å | å®ç°æ¹å¼ | ç¹ç¹ | 177| ---- | -------------- | --------------------------------------------- | -------------------------- | 178| å¹¶è¡ | å¤è¿ç¨ | å¨å¤ä¸ªå¤çå¨ææ ¸å¿ä¸è¿è¡å¤ä¸ªè¿ç¨ | å¹¶è¡ä¾èµç¡¬ä»¶ | 179| | å¤çº¿ç¨ | 夿 ¸ CPU ä¸è¿è¡å¤ä¸ªçº¿ç¨ï¼æ¯ä¸ªçº¿ç¨æ§è¡ä¸åä»»å¡ | | 180| å¹¶å | å¤çº¿ç¨å¹¶å | åä¸ä¸ªè¿ç¨ä¸å建å¤ä¸ªçº¿ç¨ï¼äº¤æ¿æ§è¡ | 并忝ä¸ç§ä»»å¡ç®¡çæ¹å¼ | 181| | å¤è¿ç¨å¹¶å | éè¿å¤è¿ç¨æ¹å¼äº¤æ¿æ§è¡å¤ä¸ªä»»å¡ | | 182| | åç¨ | å¨ä¸ä¸ªçº¿ç¨å éé»å¡å°åæ¢ä»»å¡ | | 183| 弿¥ | äºä»¶å¼æ¥ | 使ç¨äºä»¶è§¦å任塿§è¡ | 弿¥æ¯ä¸ç§éé»å¡çç¼ç¨æ¨¡å | 184| | Async/Await | éé»å¡ç I/O æä½ | |
185| | Future/Promise | 表示å³å°å®æçæä½ | | 186 187 188## 线ç¨é»å¡ 189 190> 线ç¨é»å¡éåé£äºæ¯è¾å¼ºè°\`顺åº\`çæä½ï¼å¦çå¾ ç¨æ·è¾å ¥, 宿¶ä»»å¡, çå¾ å¦ä¸ä¸ªçº¿ç¨å®ææé¡¹ä»»å¡åæè½ç»§ç»æ§è¡ç 191> 192> ä»ä¸çº¿ç¨éçåºå«ä½ å¯ä»¥å¨[è¿é](#线ç¨éå线ç¨é»å¡çåºå«)çå° 193{: .prompt-info } 194 195\`\`\`csharp 196using System; 197using System.Threading; 198 199class Program 200{ 201 // å建ä¸ä¸ª ManualResetEvent å®ä¾ï¼åå§ç¶æä¸ºæªè§¦åï¼å³é»å¡ç¶æï¼ 202 private static ManualResetEvent resetEvent = new ManualResetEvent(false); 203 204 static void Main(string[] args) 205 { 206 Console.WriteLine("主线ç¨å¯å¨ã"); 207 208 // å¯å¨ä¸ä¸ªæ°çº¿ç¨ 209 Thread workerThread = new Thread(Worker); 210 workerThread.Start(); 211 212 Console.WriteLine("æä»»æé®è§£é¤é»å¡..."); 213 Console.ReadKey(); 214 215 // è§£é¤é»å¡ï¼ä½¿å·¥ä½çº¿ç¨ç»§ç» 216 resetEvent.Set(); 217 218 // çå¾ å·¥ä½çº¿ç¨ç»æ 219 workerThread.Join(); 220 221 Console.WriteLine("主线ç¨ç»æã"); 222 } 223 224 // å·¥ä½çº¿ç¨çæ§è¡æ¹æ³ 225 static void Worker() 226 { 227 Console.WriteLine("å·¥ä½çº¿ç¨å¯å¨ï¼çå¾ ä¸»çº¿ç¨è§£é¤é»å¡..."); 228 229 // é»å¡ï¼çå¾ ManualResetEvent 被触å 230 resetEvent.WaitOne(); 231 232 Console.WriteLine("å·¥ä½çº¿ç¨ç»§ç»è¿è¡..."); 233 234 // 模æä¸äºå·¥ä½ 235 Thread.Sleep(2000); 236 237 Console.WriteLine("å·¥ä½çº¿ç¨ç»æã"); 238 } 239} 240 241\`\`\` 242 243## 线ç¨å é 244 245> 线ç¨ééåéè¦ç¡®ä¿\`æ°æ®ä¸è´æ§\`çæä½ï¼å¦ä¸é¢çæä»¶IOæä½ï¼ä»ä¸çº¿ç¨é»å¡çåºå«ä½ å¯ä»¥å¨[è¿é](#线ç¨éå线ç¨é»å¡çåºå«)çå° 246{: .prompt-info } 247 248\`\`\`csharp 249using System; 250using System.IO; 251using System.Threading; 252using System.Threading.Tasks; 253 254class Program 255{ 256 private static readonly object fileLock = new object(); 257 private static string filePath = "example.txt"; 258 259 static async Task Main(string[] args) 260 { 261 // å¯å¨å¤ä¸ªçº¿ç¨åæ¶åå ¥æä»¶ 262 Task task1 = Task.Run(() => WriteToFile("线ç¨1çæ°æ®")); 263 Task task2 = Task.Run(() => WriteToFile("线ç¨2çæ°æ®")); 264 265 await Task.WhenAll(task1, task2); 266 267 Console.WriteLine("æä»¶åå ¥å®æã"); 268 } 269 270 static void WriteToFile(string content) 271 { 272 lock (fileLock) // å éï¼ç¡®ä¿åªæä¸ä¸ªçº¿ç¨è½è¿å ¥ 273 { 274 using (StreamWriter writer = new StreamWriter(filePath, true)) // è¿½å æ¨¡å¼ 275 { 276 writer.WriteLine(content); 277 } 278 } 279 } 280} 281\`\`\` 282 283 284## 线ç¨éå线ç¨é»å¡çåºå« 285 286| | 线ç¨é | 线ç¨é»å¡ | 287| -------- | ------------------------------------------------------------- | ---------------------------- | 288| å®ä¹ | æ§å¶çº¿ç¨å¯¹èµæºç\`ç¬å \`访é®<br/>(åæ¶åªè½æä¸ä¸ªçº¿ç¨å¨è®¿é®èµæº) | è®©çº¿ç¨æåæ§è¡ï¼çå¾ æ¡ä»¶æ»¡è¶³ | 289| ç®ç | ä¿æ¤å ±äº«èµæºç宿´æ§ | æ§å¶çº¿ç¨æ§è¡çé¡ºåº | 290| è§¦åæ¡ä»¶ | 线ç¨è¯å¾è®¿é®å·²ä¸éçèµæº | çå¾ æä¸ªæ¡ä»¶ãèµæºãæ¶é´ | 291| å½±å | åæ¶åªå 许ä¸ä¸ªçº¿ç¨è®¿é®èµæº | å½å线ç¨åæ¢è¿è¡ï¼éæ¾CPU | 292 293 294## çº¿ç¨æ± 295 296**ç®ç**: 管çåå¤ç¨çº¿ç¨ï¼åå°é¢ç¹å建åéæ¯çº¿ç¨å¸¦æ¥çå¼é 297 298éç¨äº I/O å¯éåä»»å¡ãçæ¶é´å¤§éççå¹¶è¡ä»»å¡ãé¢ç¹æ§è¡çä»»å¡ 299 300> ***å¨C#ä¸ï¼çº¿ç¨çå建ã鿝åå¤ç¨é½æ¯èªå¨ç®¡çç, è¿ä¼å¼åºä¸é¢çé®é¢*** 301{: .prompt-info } 302 303> **çº¿ç¨æ± ä¸ççº¿ç¨æ°éæ¯æéç**ï¼é»è®¤ä¼æ ¹æ®ç³»ç»ç CPU æ ¸å¿æ°èªå¨è°è, ä½ å¯ä»¥éè¿ \`ThreadPool.SetMinThreads\` å \`ThreadPool.SetMaxThreads\` 设置æå°åæå¤§çº¿ç¨æ° 304> 305> **çº¿ç¨æ± ä¸ç线ç¨ç±ç³»ç»èªå¨ç®¡ç**ï¼å¼åè æ æ³ç´æ¥æ§å¶çº¿ç¨çå¯å¨åç»æ¢ãè¿éåçæ¶é´ä»»å¡ï¼ä½ä¸éåéè¦ç²¾ç¡®æ§å¶çº¿ç¨çå½å¨æçåºæ¯ 306> 307> **çº¿ç¨æ± 主è¦è®¾è®¡ç¨äºå¤ççå°çä»»å¡**ï¼ä¸éåé¿æ¶é´è¿è¡çä»»å¡ãé¿æ¶é´è¿è¡çä»»å¡å¯è½ä¼å ç¨çº¿ç¨æ± ä¸ç线ç¨ï¼å¯¼è´å ¶ä»ä»»å¡æ æ³åæ¶è·å¾çº¿ç¨æ§è¡ã 308{: .prompt-warning } 309 310 311æä¸ç§æ¹æ³å¯ä»¥ä½¿ç¨çº¿ç¨æ± ï¼ 312 313### ThreadPool.QueueUserWorkItem 314 315\`\`\`csharp 316using System; 317using System.Threading; 318 319class Program 320{ 321 static void Main() 322 { 323 // æäº¤ä»»å¡å°çº¿ç¨æ± 324 ThreadPool.QueueUserWorkItem(DoWork, "ä»»å¡1"); 325 ThreadPool.QueueUserWorkItem(DoWork, "ä»»å¡2"); 326 327 Console.WriteLine("ä»»å¡å·²æäº¤å°çº¿ç¨æ± "); 328 Console.ReadLine(); // 鲿¢ç¨åºç«å³éåº 329 } 330 331 static void DoWork(object state) 332 {
333 string taskName = state as string; 334 Console.WriteLine($"{taskName} æ£å¨æ§è¡ï¼çº¿ç¨ID: {Thread.CurrentThread.ManagedThreadId}"); 335 Thread.Sleep(1000); // 模æä»»å¡èæ¶ 336 Console.WriteLine($"{taskName} æ§è¡å®æ"); 337 } 338} 339\`\`\` 340 341### Task 342 343\`\`\`csharp 344using System; 345using System.Threading.Tasks; 346 347class Program 348{ 349 static async Task Main() 350 { 351 // ä½¿ç¨ Task æäº¤ä»»å¡å°çº¿ç¨æ± 352 Task task1 = Task.Run(() => DoWork("ä»»å¡1")); 353 Task task2 = Task.Run(() => DoWork("ä»»å¡2")); 354 355 await Task.WhenAll(task1, task2); 356 357 Console.WriteLine("ææä»»å¡å®æ"); 358 } 359 360 static void DoWork(string taskName) 361 { 362 Console.WriteLine($"{taskName} æ£å¨æ§è¡ï¼çº¿ç¨ID: {Thread.CurrentThread.ManagedThreadId}"); 363 Task.Delay(1000).Wait(); // 模æä»»å¡èæ¶ 364 Console.WriteLine($"{taskName} æ§è¡å®æ"); 365 } 366} 367\`\`\` 368 369### Parallel 370 371æ¤æ¹æ³å¨[䏿](#å¹¶è¡)ææå°è¿ 372 373\`\`\`csharp 374using System; 375using System.Threading.Tasks; 376 377class Program 378{ 379 static void Main() 380 { 381 // ä½¿ç¨ Parallel.For å¹¶è¡æ§è¡ä»»å¡ 382 Parallel.For(0, 5, i => 383 { 384 Console.WriteLine($"ä»»å¡ {i} æ£å¨æ§è¡ï¼çº¿ç¨ID: {Thread.CurrentThread.ManagedThreadId}"); 385 Task.Delay(500).Wait(); // 模æä»»å¡èæ¶ 386 Console.WriteLine($"ä»»å¡ {i} æ§è¡å®æ"); 387 }); 388 389 Console.WriteLine("ææä»»å¡å®æ"); 390 } 391} 392\`\`\` 393 394## åæ¶çº¿ç¨ 395 396å¨éè¦è®©æä¸çº¿ç¨åæ¢å·¥ä½æ¶ï¼ç±äºå¯è½ä¼åçèµæºæ³é²ãä¸ä¸è´(忣就æ¯ä¼åºé®é¢)ä¸è¬ä¸æ¨èéæ¯çº¿ç¨ï¼è§£å³æ¹æ³æ¯ä½¿ç¨**åæ¶è¯·æ±** 397 398\`\`\`csharp 399using System; 400using System.Threading; 401 402class Program 403{ 404 static void Main() 405 { 406 // åå»ºåæ¶ä¿¡å·æº 407 CancellationTokenSource cts = new CancellationTokenSource(); 408 409 // å¯å¨çº¿ç¨å¹¶ä¼ å ¥åæ¶ä»¤ç 410 Thread thread = new Thread(() => DoWork(cts.Token)); 411 thread.Start(); 412 413 // çå¾ ä¸æ®µæ¶é´ååæ¶çº¿ç¨ 414 Thread.Sleep(2000); 415 Console.WriteLine("请æ±åæ¶çº¿ç¨..."); 416 cts.Cancel(); 417 418 // çå¾ çº¿ç¨å®æ 419 thread.Join(); 420 Console.WriteLine("线ç¨å·²ç»æ¢"); 421 } 422 423 static void DoWork(CancellationToken token) 424 { 425 Console.WriteLine("线ç¨å¼å§æ§è¡..."); 426 for (int i = 0; i < 10; i++) 427 { 428 // æ£æ¥æ¯å¦æåæ¶è¯·æ± 429 if (token.IsCancellationRequested) 430 { 431 Console.WriteLine("åæ¶è¯·æ±å·²æ¶å°ï¼çº¿ç¨å³å°éåº..."); 432 return; 433 } 434 435 // 模æå·¥ä½ 436 Console.WriteLine($"æ£å¨å¤çæ°æ® {i}..."); 437 Thread.Sleep(1000); 438 } 439 Console.WriteLine("çº¿ç¨æ£å¸¸ç»æ"); 440 } 441} 442 443\`\`\` 444 445## ç»æ¢çº¿ç¨ 446 447> ***å¨C#ä¸ï¼ç»æ¢çº¿ç¨å¯è½ä¼å¯¼è´ä¸ä¸è´çç¶æï¼å æ¤å¨.NET Coreå.Net5ä¹å已被å¼ç¨*** 448{: .prompt-danger } 449 450ç±äºå·²ç»å¼ç¨ä¸ä¸æ¨è使ç¨ï¼è¿éåªè¯´ä¸ä¸æ¹æ³å 451\`\`\`csharp 452Thread.Abort() 453\`\`\` 454 455## å¦ä½ä½¿ç¨å¹¶ååå¹¶è¡ 456 457å¨Webå¼åä¸ï¼å¸¸ä¼å¬å°äººä»¬å¨å¼ºè°é«å¹¶åèéé«å¹¶è¡ 458 459æä»¬å°±ä»¥è¿ä¸ªä¸ºä¾åæ¥è®²ä¸ä¸ä»ä¹æ¶åç¨å¹¶åï¼ä»ä¹æ¶åç¨å¹¶è¡ 460 461### å·¥ä½è´è½½ 462 463å·¥ä½è´è½½å¸¸ä¸º**I/Oå¯éå**å**CPUå¯éå**ä»»å¡ 464 465### I/Oå¯éå 466 467大é¨å Web 请æ±çæä½å æ¬æ°æ®åºæ¥è¯¢ãæä»¶è¯»åãç½ç»éä¿¡çï¼ä¸»è¦æ¯**I/O æä½**èé**夿ç计ç®** 468 469å¨å¤çè¿äºæä½æ¶ï¼å¤çççå¾ æ¶é´é常æ¯ç¶é¢ï¼èé计ç®è½å 470 471å æ¤ Web å¼åæ´å ³æ³¨å¦ä½å¤ç大éçå¹¶å请æ±ï¼ä»¥ä¾¿å¨å¤ä¸ªè¯·æ±ä¹é´ææå©ç¨èµæºï¼è䏿¯æé«å个请æ±çæ§è¡é度 472 473### CPUå¯éå 474 475ç§å¦è®¡ç®ãå¾åå¤ççä»»å¡éè¦å åå©ç¨CPU夿 ¸æ§è½ï¼è¿æ ·å¯ä»¥å©ç¨å¤ä¸ªæ ¸å¿è¿è¡å¤ä¸ªä»»å¡æ¥å é计ç®ç»æ 476 477### I/Oå¯éåä»»å¡å¸¸ç¨å¹¶åï¼CPUå¯éåä»»å¡å¸¸ç¨å¹¶è¡ 478 479ç±æ¤å¯è§ï¼åWebæå¡è¿ç§å¯¹ç®åè¦æ±æ´ä½ï¼ä½æ¯æ¶åå°å¾å¤è¯·æ±ç**I/Oå¯éå**ä»»å¡ï¼ä½¿ç¨**å¹¶å**æ¯ä¸ªæ´å¥½çéæ©ï¼å¨åä¸ªæ ¸å¿å è½å¤åæ¶å¤çæ´å¤çä»»å¡ 480 481å¨é«å¹¶åç¯å¢ä¸ï¼èµæºçå¤ç¨å髿è°åº¦æ¯å ³é®ãç°ä»£ Web æå¡å¨å¾åä
481ºä½¿ç¨çº¿ç¨æ± ãåç¨çæºå¶æ¥æ§å¶èµæºæ¶èã妿æ¯ä¸ªè¯·æ±é½å建ä¸ä¸ªçº¿ç¨ï¼ç³»ç»èµæºä¼è¿ éèå°½ï¼ç¸åï¼éè¿å¹¶åç¼ç¨æ¨¡åï¼å¯ä»¥è®©å°éç线ç¨å¤ç大éç请æ±ï¼æåæå¡å¨çèµæºä½¿ç¨æç 482 483--- 484 485åç§å¦è®¡ç®è¿ç§éè¦å¤§éç®åç**CPUå¯éå**ä»»å¡ï¼ä½¿ç¨**å¹¶è¡**æ¯ä¸ªæ´å¥½çéæ©ï¼å¯ä»¥å åå©ç¨å¤æ ¸CPUçå ¨é¨æ§è½ 486`;export{n as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.