在将async-await
编程引入C#之前,如何能够将网络请求放入另一个线程并将执行时间返回给CPU,直到收到响应为止,这样该线程才不会浪费CPU时间。 ?
因为当CPU为该线程分配时间并且线程处于空闲状态等待响应时,那会浪费CPU时间,对吧?
答案 0 :(得分:2)
从几种方面来说,Asynchronous Programming Model (APM)是这种 Asynchrony
的首选使用IAsyncResult设计模式的异步操作是 实现为两个名为
BeginOperationName
的方法,EndOperationName
开始和结束异步操作OperationName
。例如,FileStream
类提供BeginRead
和EndRead
方法来异步从 文件。这些方法实现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();
}