你的位置:首页 > ASP.net教程

[ASP.net教程][.NET] 利用 async await 进行异步 IO 操作(整理中...)


利用 async & await 进行异步 IO 操作

  可以使用异步函数访问文件。使用异步功能,可以调用异步方法,而不使用回调或拆分您在多个方法或 lambda 表达式中的代码。 若要使同步代码异步,则调用异步方法而不是一个同步方法并添加几个关键字到代码中。

  您可能认为添加的以下原因 asynchrony 到文件访问调用:

  • Asynchrony 建议于应用程序的响应能力更强。,因为是一个操作的 UI 线程可以执行其他工作。 如果 UI 线程必须执行需要很长时间的代码(例如,超过 50 毫秒),UI 可以冻结,直到 I/O 完成的,并且用户界面线程可以重新处理键盘和鼠标输入和其他操作。

  • Asynchrony 通过减少对线程的需要增强 ASP.NET 和其他的可伸缩性基于服务器的应用程序。 如果应用程序使用专用线程上每个响应,并且一次两个请求同时处理,则有线程是必需的。 在等待期间,异步操作通常不需要使用线程。 它们简要使用现有的 I/O 完成线程在末尾。

  • 文件访问操作的延迟可能非常低在当前情况,但是,延迟在以后可能会大大提高。 例如,文件可能会移至位于 the world 的服务器。

  • 添加的开销使用异步功能很小。

  • 异步任务可以并行轻松地运行。

 

对 FileStream 选件类的使用


  本主题中的示例使用 FileStream 选件类,它具有一个选项导致异步 I/O 发生在操作系统级别。 使用此选项,您可以避免在许多情况下阻止线程池线程。 若要启用此选项,则指定 useAsync=true 或在构造函数中 options=FileOptions.Asynchronous 参数调用。

  不能对 StreamReader 和 StreamWriter 的此选项,如果直接通过指定文件路径打开这些文件。 但是,您可以使用此选项,则提供自己 FileStream选件类打开的 Stream。 请注意,异步调用是比在 UI app,即使线程池线程阻塞,在等待期间,因为用户界面线程未阻止。

 

编写文本

  下面的示例写入文本到文件。 在每个请等待语句,则此方法会立即退出。 当文件 I/O 完成时,方法以等待语句后面的语句。 请注意"修饰符在使用等待语句方法的定义。

 1     /// <summary> 2     /// 异步写入文件 3     /// </summary> 4     /// <returns></returns> 5     private async Task WriteTextAsync() 6     { 7       var path = $"temp.txt"; 8       var content = Guid.NewGuid().ToString(); 9 10       using (var fs = new FileStream(path,11         FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, bufferSize: 4096, useAsync: true))12       {13         var buffer = Encoding.UTF8.GetBytes(content);14 15         //var writeTask = fs.WriteAsync(buffer, 0, buffer.Length);16         //await writeTask;17         await fs.WriteAsync(buffer, 0, buffer.Length);18       }19     }

  行号 17 的语句可以修改为:

1  //await fs.WriteAsync(buffer, 0, buffer.Length);2  //可以改为3  var writeTask = fs.WriteAsync(buffer, 0, buffer.Length);4  await writeTask;

  第一个语句(行号 1)返回任务并导致进程的文件。 使用等待的第二个语句(行号3、4)导致方法立即退出并返回其他任务。 当随后处理的文件完成时,执行回 await 的语句。