代码之家  ›  专栏  ›  技术社区  ›  John L.

异步等待前线程屈服

  •  1
  • John L.  · 技术社区  · 7 年前

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   TheGeneral    7 年前

    然而,在很多方面 Asynchronous Programming Model (APM) 是这种类型的 异步

    使用IAsyncResult设计模式的异步操作是 BeginOperationName 和 EndOperationName 开始和结束 异步操作 OperationName 分别。例如 FileStream 类提供 BeginRead EndRead 方法 异步 从文件读取字节 文件。这些方法实现了读取的异步版本 方法。

    因为当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();
    }