百度服务电话在线人工,大型网站seo课程,永兴县网站建设推广公司,网络公司经营范围可以加婚介吗async 和 await 关键字只是编译器功能#xff0c;编译器会用Task类创建代码。
返 回值是一个Task#xff0c;这种返回新线程的方法虽然可以提高系统的响应能力#xff0c;但是多线程取值会给编码带来不便#xff0c;所以新出的关键字await用于阻塞当前线程并 获取目标线程… async 和 await 关键字只是编译器功能编译器会用Task类创建代码。
返 回值是一个Task这种返回新线程的方法虽然可以提高系统的响应能力但是多线程取值会给编码带来不便所以新出的关键字await用于阻塞当前线程并 获取目标线程的返回值在方法体中使用await关键字后要求将方法声明为async用来表示该方法是异步的并且返回值必须为void或者将返回者封装 在一个Task中
1、创建任务 同步方法Greeting 该方法等待一段时间后返回一个字符串通过GetHashCode 查看当前线程ID
代码如下 static string Greeting(string name){Task.Delay(3000).Wait();int j Task.CurrentId.GetHashCode();Console.WriteLine(name name);int i Thread.CurrentThread.GetHashCode();Thread.Sleep(3000);Console.WriteLine(Task 的线程HASHCODE是: j);Console.WriteLine(Thread 的线程HASHCODE是 i);Console.ReadLine();Thread.Sleep(3000);return $Hello,{name};} 定义方法GreetingAsync可以使方法异步化基于任务的异步模式指定在异步方法名后加上Async后缀并返回一个任务异步方法GreetingAsync 和 同步方法Greeting具有相同的输入参数但是异步方法返回的是TaskstringTaskstring 定义了一个返回字符串的任务。代码如下所示 /// summary/// 异步调用方法/// /summary/// param namename/param/// returns/returnsstatic Taskstring GreetingAsync(string name){return Task.Runstring((){return Greeting(name);});} 2、调用异步方法
可以使用await 关键字来调用返回任务的异步方法GreetingAsync使用await 关键字需要用async修饰符声明的方法在GreetingAsync方法完成前该方法内其他代码不会继续执行但是启动
CallerWithAsync方法的线程可以被重用该线程没有阻塞。
代码如下所示 class Program{static void Main(string[] args){CallerWithAsync();}/// summary/// 调用异步方法/// /summaryprivate async static void CallerWithAsync(){string result await GreetingAsync(chenk);Console.WriteLine(result);} 3、延时任务
GreetingAsync 方法返回一个Taskstring 对象对象包含任务创建的信息并保存到任务完成Task类的ContinueWith 方法定义了任何完成后就调用的代码指派给ContinueWith方法的委托将已完成的任务作为参数传入使用Result属性可以访问任务返回的结果。代码如下 /// summary/// 延续任务/// /summaryprivate static void CallerWithContinuationTask(){Taskstring t1 GreetingAsync(chenk);//编译器把await 关键字后的代码放进ContinueWith 方法的代码块转换await关键字t1.ContinueWith(t {string result t.Result;Console.WriteLine(CallerWithContinuationTask 线程Id : Thread.CurrentThread.GetHashCode() ; result 的值为 result);Console.ReadLine();});} 4、同步上下文
验证方法中使用的线程可以点击‘启动’——在‘调试’中选择‘线程’即可查看当前异步程序运行的线程数及位置以CallerWithContinuationTask为例可以看到一个线程为主线程、一个线程在调用GreetingAsync方法、一个线程在执行ContinueWith方法内的代码堆。截图如下 5、使用多个异步方法
5.1 按顺序调用多个异步方法
使用await 关键字可以调用每个异步方法如果一个异步方法依赖于另一个异步方法的结果await关键字就非常有用。
本例中GreetingAsync 异步方法的第二次调用完全独立于第一次调用的结果如果每个异步方法都不使用await那么整个MultipleAsyncMethods异步方法将更快返回结果。代码如下 private async static void MutipleAsyncMethods(){string s1 await GreetingAsync(chenk);string s2 await GreetingAsync(zhangf);Console.WriteLine(Finished both methods \nResult 1: s1 \nResult 2: s2);Console.ReadLine();} 5.2 使用组合器
如果异步方法不依赖于其他异步方法则每个异步方法都不使用await 而是把每个异步方法的返回结果赋值给Task变量就会运行的更快GreetingAsync方法返回Taskstring。这些方法现在可以并行执行了。
组合器可以帮助实现这一点一个组合器可以接受多个同一类型的参数并返回同一类型的值多个同一类型的参数被组合成一个参数传递Task组合器接受多个Task对象作为参数并返回一个Task。
示例代码采用Task.WhenAll组合器方法它可以等待直到两个任务都完成。代码如下 /// summary/// 组合器 WhenAll/// /summaryprivate async static void MultipleAsyncMethodWithCombinatoral(){Taskstring t1 GreetingAsync(chenk);Taskstring t2 GreetingAsync(zhangf);//WhenAll 组合器从WhenAll方法返回的Task,是在所有传入方法的任务都完成了才会返回Task。//WhenAny 组合器是在其中一个传入方法的任务完成了就会返回Task。await Task.WhenAll(t1, t2);}/// summary/// 组合器WhenAll 重载如果所有的任务返回相同的类型那么该类型的数组可用于await返回的结果/// /summaryprivate async static void MultipleAsyncMethodWithCombinatoral2(){Taskstring t1 GreetingAsync(chenk);Taskstring t2 GreetingAsync(zhangf);string[] result await Task.WhenAll(t1, t2);}