背景基,正在看c#core项目,介绍中间件,提到异步,不是特别清楚,
//快捷定义一个异步委托,它的作用是处理所有请求,都是这个委托,仅仅只是练习demo实际中几乎不可能这样用
//因为它是一个终端中间件,调用即完成请求处理,返回,其他后面的内容根本没机会执行
//这里的Async仅仅只是为了使用await,进行标记的lambda表达式
app.Run(async context =>
{
//里面异步方法,可包含await表达式,下面方法是一个异步方法
await context.Response.WriteAsync("await关键字,调用async结尾异步方法!");
});
基于官方文档来学习, 基于官方文档来学习, ,基于官方文档来学习,
总结如下:
async一个是在定义声明标记异步强调声明,可供另一个关键字await来使用,一个在调用方调用时等异步执行完,它的中英文名字await非常形象生动,强调执行完,在调用这个方法,async和await几乎总是成双成对,
async返回类型必须是Task ,Task<T>,void三者之一,且有该关键字,
所谓异步方法,就是调用即马上返回Task,只是请理解返回的是一个Task任务而已,从感觉来看和一般方法执行完意思差不多,马上执行后面的内容,尽管在当前调用主线程,他并未真正执行完。
看代码
// Three things to note in the signature:
// - The method has an async modifier.
// - The return type is Task or Task<T>. (See "Return Types" section.)
// Here, it is Task<int> because the return statement returns an integer.
// - The method name ends in "Async."
async Task<int> AccessTheWebAsync()
{
// You need to add a reference to System.Net.Http to declare client.
HttpClient client = new HttpClient();
// GetStringAsync returns a Task<string>. That means that when you await the
// task you'll get a string (urlContents).
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
// You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork();
// The await operator suspends AccessTheWebAsync.
// - AccessTheWebAsync can't continue until getStringTask is complete.
// - Meanwhile, control returns to the caller of AccessTheWebAsync.
// - Control resumes here when getStringTask is complete.
// - The await operator then retrieves the string result from getStringTask.
string urlContents = await getStringTask;
// The return statement specifies an integer result.
// Any methods that are awaiting AccessTheWebAsync retrieve the length value.
return urlContents.Length;
}
-
事件处理程序调用并等待AccessTheWebAsync异步方法。
-
AccessTheWebAsync创建一个HttpClient实例,并调用GetStringAsync异步方法以字符串形式下载网站的内容。
-
GetStringAsync中发生了一些事情,这会暂停其进度。也许它必须等待网站下载或其他阻止活动。为了避免阻塞资源,GetStringAsync将控制权交给其调用者AccessTheWebAsync。
GetStringAsync返回一个Task,其中TResult是一个字符串,AccessTheWebAsync将任务分配给getStringTask变量。该任务表示对GetStringAsync的调用的正在进行的过程,并承诺在工作完成后会产生一个实际的字符串值。
-
因为尚未等待getStringTask,所以AccessTheWebAsync可以继续进行其他不依赖于GetStringAsync最终结果的工作。通过调用同步方法DoIndependentWork来表示该工作。
-
DoIndependentWork是一个同步方法,它将完成其工作并返回其调用方。
-
AccessTheWebAsync耗尽了本该可以做的工作,而没有getStringTask的结果。AccessTheWebAsync接下来要计算并返回下载的字符串的长度,但是该方法只有在具有字符串之后,才能计算该值。
因此,AccessTheWebAsync使用await操作符来暂停其进度并将控制权交给调用AccessTheWebAsync的方法。AccessTheWebAsync将Task(Of Integer)或Task <int>返回给调用方。该任务表示将产生一个整数结果,即下载的字符串的长度。
注意
如果在AccessTheWebAsync等待GetStringAsync(因此getStringTask)完成之前,控件将保留在AccessTheWebAsync中。如果调用的异步过程(getStringTask)已经完成,并且AccessTheWebSync不必等待最终结果,则挂起然后返回AccessTheWebAsync的开销将被浪费。
在调用方(此示例中为事件处理程序)内部,重复该过程。在等待该结果之前,调用者可能会执行不依赖于AccessTheWebAsync结果的其他工作,否则,调用者可能会立即等待。当事件处理程序到达await表达式时,应用程序将重点放在GetStringAsync的完成上。事件处理程序正在等待AccessTheWebAsync,而AccessTheWebAsync正在等待GetStringAsync。
-
GetStringAsync完成并产生一个字符串结果。调用GetStringAsync不会以您期望的方式返回字符串结果。(请记住,该方法已在步骤3中返回了一个任务。)相反,字符串结果存储在代表方法完成的任务getStringTask中。等待操作符从getStringTask检索结果。分配语句将检索到的结果分配给urlContents。
-
当AccessTheWebAsync具有字符串结果时,该方法可以计算字符串的长度。然后,AccessTheWebAsync的工作也完成了,等待事件处理程序可以恢复。在主题末尾的完整示例中,您可以确认事件处理程序检索并打印了长度结果的值。
async一个是在定义声明标记异步强调声明,可供另一个关键字await来使用,一个在调用方调用时等异步执行完,它的中英文名字await非常形象生动,强调执行完,在调用这个方法,async和await几乎总是成双成对,
async返回类型必须是Task ,Task<T>,void三者之一,且有该关键字,
所谓异步方法,就是调用即马上返回Task,只是请理解返回的是一个Task任务而已,从感觉来看和一般方法执行完意思差不多,马上执行后面的内容,尽管在当前调用主线程,他并未真正执行完。
-
方法签名包括异步或异步修饰符。
-
按照惯例,异步方法的名称以“ Async”后缀结尾。
-
返回类型是以下类型之一:
-
任务,如果你的方法,其中操作数的类型TResult return语句。
-
任务,如果你的方法没有返回语句或具有不带操作数return语句。
-
Void(Visual Basic中的Sub),如果您正在编写异步事件处理程序。
有关更多信息,请参见本主题后面的“返回类型和参数”。
-
-
该方法通常至少包含一个await表达式,该表达式表示该方法要等到异步操作完成后才能继续。同时,该方法被挂起,控制权返回给该方法的调用者。
看官方文档,本文内容几乎全是来自官方文档,这里转写,加深印象。