在异步等待之前产生线程

时间:2018-10-24 01:40:34

标签: c# multithreading asynchronous async-await

在将async-await编程引入C#之前,如何能够将网络请求放入另一个线程并将执行时间返回给CPU,直到收到响应为止,这样该线程才不会浪费CPU时间。 ?

因为当CPU为该线程分配时间并且线程处于空闲状态等待响应时,那会浪费CPU时间,对吧?

1 个答案:

答案 0 :(得分:2)

从几种方面来说,Asynchronous Programming Model (APM)是这种 Asynchrony

的首选
  

使用IAsyncResult设计模式的异步操作是   实现为两个名为BeginOperationName的方法,   EndOperationName开始和结束异步操作   OperationName。例如,FileStream类提供   BeginReadEndRead方法来异步从   文件。这些方法实现Read的异步版本   方法。

回答您的问题

  

因为当CPU为该线程分配时间并且线程处于空闲状态时   等待响应,那会浪费CPU时间,对吧?

不阻塞线程并等待完成端口回叫不会导致CPU周期耗尽,但是对线程进行轮询将成为可能。

这是如何工作的,但是可以在此处看到示例用法

用法示例

private static void TestWrite()
{ 
   // Must specify FileOptions.Asynchronous otherwise the BeginXxx/EndXxx methods are
   // handled synchronously.
   FileStream fs = new FileStream(Program.FilePath, FileMode.OpenOrCreate,
      FileAccess.Write, FileShare.None, 8, FileOptions.Asynchronous);

   string content = "A quick brown fox jumps over the lazy dog";
   byte[] data = Encoding.Unicode.GetBytes(content);

   // Begins to write content to the file stream.
   Console.WriteLine("Begin to write");
   fs.BeginWrite(data, 0, data.Length, Program.OnWriteCompleted, fs);
   Console.WriteLine("Write queued");
}

private static void OnWriteCompleted(IAsyncResult asyncResult)
{ 
   // End the async operation.
   FileStream fs = (FileStream)asyncResult.AsyncState;
   fs.EndWrite(asyncResult);

   // Close the file stream.
   fs.Close();
   Console.WriteLine("Write completed");

   // Test async read bytes from the file stream.
   Program.TestRead();
}