[.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 的语句。

时间: 2024-12-26 01:50:28

[.NET] 利用 async & await 进行异步 IO 操作(整理中...)的相关文章

[.NET] 利用 async &amp; await 的异步编程

利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html  目录 异步编程的简介 异步提高响应能力 更容易编写的异步方法 异步方法的控制流 线程 async 和 await 返回类型和参数信息 命名的约定 一.异步编程的简介 通过使用异步编程,你可以避免性能瓶颈并增强应用程序的总体响应能力. Visual Studio 2012 引入了一个简化的方法,异步编程,在 .NET Framewo

Atitit.&#160;Async&#160;await&#160;优缺点&#160;异步编程的原理and实现&#160;java&#160;c#&#160;php

Atitit. Async await 优缺点 异步编程的原理and实现 java c# php 1. async & await的来源1 2. 异步编程history1 2.1. 线程池 2 2.2. 返回值2 2.3. Semaphore 信号量2 2.4. 线程的异常,主线程可以捕获到么2 3. await并不是针对于async的方法,而是针对async方法所返回给我们的Task,2 4. Java里面的task 跟个 await3 5. ---code4 6. async & aw

ASP.NET WebForm中用async/await实现异步出人意料的简单

1. 在.aspx中添加异步标记 <%@ Page Language="C#" Async="true"%> 2. 在.aspx.cs或者.ascx.cs(用户控件)中添加异步方法 private async Task GetMyPosts() { var posts = await ServiceFactory.BlogPostSevice.GetBlogPostsPagedAsync(); rpPosts.DataSource = posts; rp

006 异步IO操作

# 异步IO操作 CreateFile 使用 VS2015 新建win32 控制台应用程序 WindowsFileDemo win32控制台写窗口程序 需要加入头文件 #include <fileAPI.h> 就可以来使用CreateFile 分别有 CreateFileA  CreateFileW 窄字节 宽字节 1 HANDLE WINAPI CreateFile( 2 _In_ LPCTSTR lpFileName, 3 _In_ DWORD dwDesiredAccess, 4 _In

node.js零基础详细教程(4):node.js事件机制、node异步IO操作

第四章 建议学习时间3小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑.编写接口,最后完成一个完整的项目后台,预计共10天课程. node.js事件机制 node.js是单线程,但是通过事件和回调支持并发,可以实现非常高的性能. node.js所有的API都是通过异步调用.第一堂课的时候,我们写过一个同步和异步的示例(如下),当初说到:同步代码先执行完成,然后才执行异步

async+await处理异步问题

在编写网页的时候我们常常会遇到异步问题,async+await是es6提出的解决异步的方法,下面我们来看看这个方法怎么实现解决异步的, 大家都知道,setTimeout是一个定时器.他是一个异步执行的语句.如: function foo(){ setTimeout(()=>{ console.log(1) },1000) console.log(2) } 答案肯定是2,1 因为setTimeout是一个异步执行语句,所以下面一个会先执行完后再执行异步. 可是,我们有时候会想让异步先执行完了再执行

js async await 终极异步解决方案

既然有了promise 为什么还要有async await ? 当然是promise 也不是完美的异步解决方案,而 async await 的写法看起来更加简单且容易理解. 回顾 Promise Promise 对象用于表示一个异步操作的最终状态(完成或失败),以及其返回的值. Promise 对象是由关键字 new 及其构造函数来创建的.构造函数会,把一个叫做“处理器函数”(executor function)的函数作为它的参数.这个“处理器函数”接受两个函数resolve 和 reject 

async/await处理异步

async函数返回一个Promise对象,可以使用then方法添加回调函数.当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句. 看代码: 指定多少毫秒后输出一个值 function timeout(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } async function asyncPrint(value, ms) { await timeout(ms);

初始Python的异步IO操作(待完善)

1 import aiohttp 2 import asyncio 3 4 def consumer(): 5 r='' 6 while True: 7 n = yield r 8 if n: 9 r='200 OK' 10 print('客户取走了%s'%(str(n))) 11 else: 12 print('没货') 13 14 def producer(c): 15 n=0 16 c.send(None) 17 while n<5: 18 n+=1 19 print('生产了%s'%(s