利用 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 的语句。
时间: 2024-12-26 01:50:28