async方法:async+await
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace 异步
{
class AwaitAsyncShow
{ #region 没有await前提下与普通方法无异
/// <summary>
/// 注:async与await要成对出现,否则生命async方法无效
/// async与await只能在方法中声明,如下
/// </summary>
public static async void Show() //这里有警告正常
{
Console.WriteLine("开始执行前...");
Task task = Task.Run(() =>
{
Console.WriteLine("这里是异步多线程开始调用......");
});
//如果在task后面不加await,则只能当成普通方法使用,且不会有线程等待
Console.WriteLine("开始执行后...");
}
#endregion #region 异步方法await+async
public static void Invoke()
{
AwaitShow();// 这里执行异步方法
//在上面的AwaitShow()用await task等待的时候,这里主线程开始执行下面的任务
for (int i = ; i < ; i++)
{
Console.WriteLine($"这里由主线程来执行,当前线程ID为:{Thread.CurrentThread.ManagedThreadId}......");
}
} public static async void AwaitShow()
{
Console.WriteLine($"开始执行前,当前线程id:{Thread.CurrentThread.ManagedThreadId}...");
Task task = Task.Run(() =>
{
Console.WriteLine($"这里是异步多线程开始调用1,当前线程ID为:{Thread.CurrentThread.ManagedThreadId}......");
Thread.Sleep();
Console.WriteLine($"这里是异步多线程开始调用2,当前线程ID为:{Thread.CurrentThread.ManagedThreadId}......");
});
await task; //主线程到这里就返回到上面的Invoke()方法中,去执行别的任务去了 //后面的这句话当成了一个委托,task的回调函数了,等到task子线程执行完后执行这句话
//这个回调线程是不确定的,可以是主线程,也可以是子线程
Console.WriteLine($"开始执行后,当前线程id:{Thread.CurrentThread.ManagedThreadId}...");
}
#endregion #region 带返回值得async异步方法,没有return语句,反人类
public static async Task NoReturnTask()
{
Console.WriteLine($"开始执行前,当前线程id:{Thread.CurrentThread.ManagedThreadId}...");
Task task= Task.Run(() =>
{
Console.WriteLine($"这里是异步多线程开始调用1,当前线程ID为:{Thread.CurrentThread.ManagedThreadId}......");
Thread.Sleep();
Console.WriteLine($"这里是异步多线程开始调用2,当前线程ID为:{Thread.CurrentThread.ManagedThreadId}......");
});
await task; //在这里直接返回task,吊不吊 //注:这里相当没有返回值,最好不要用void类型,可用Task类型
}
#endregion #region 更反人类的返回类型
public static async Task<long> SumAsync()
{
Console.WriteLine($"开始执行前,当前线程id:{Thread.CurrentThread.ManagedThreadId}...");
long sum = ;
await Task.Run(() =>
{
for (int i = ; i < ; i++)
{
sum += i;
}
});
Console.WriteLine($"开始执行后,当前线程id:{Thread.CurrentThread.ManagedThreadId}...");
return sum; //返回类型明明是Task<long>类型,但返回值却是long类型,就像返回一个委托一样 //如果要返回一个类型值,请用Task<T> 相当于委托
}
#endregion
}
}
主程序调用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 异步
{
class Program
{
static void Main(string[] args)
{
AwaitAsyncShow.Invoke(); //这里调用带返回值的async方法
Task<long> sumTask = AwaitAsyncShow.SumAsync();
long result = sumTask.Result;
Console.WriteLine($"sum结果为:{result}");
Console.ReadLine();
}
}
}
执行结果
async方法:async+await的更多相关文章
- 异步编程系列第04章 编写Async方法
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
- .NET(C#):await返回Task的async方法
众所周知,async方法只可以返回void,Task和Task<T>. 对于返回void的async方法,它并不是awaitable,所以其他方法不能用await方法来调用它,而返回Tas ...
- 水火难容:同步方法调用async方法引发的ASP.NET应用程序崩溃
之前只知道在同步方法中调用异步(async)方法时,如果用.Result等待调用结果,会造成线程死锁(deadlock).自己也吃过这个苦头,详见等到花儿也谢了的await. 昨天一个偶然的情况,造成 ...
- ASP.NET MVC 如何在一个同步方法(非async)方法中等待async方法
问题 首先,在ASP.NET MVC 环境下对async返回的Task执行Wait()会导致线程死锁.例: public ActionResult Asv2() { //dead lock var t ...
- MVC 如何在一个同步方法(非async)方法中等待async方法
MVC 如何在一个同步方法(非async)方法中等待async方法 问题 首先,在ASP.NET MVC 环境下对async返回的Task执行Wait()会导致线程死锁.例: public Actio ...
- C++ std::async vs async/await in C# - Stack Overflow
C++ std::async vs async/await in C# - Stack Overflow 我想知道新的c ++功能std::async是否与两个C#关键字async / await相当 ...
- Spring @async 方法上添加该注解实现异步调用的原理
Spring @async 方法上添加该注解实现异步调用的原理 学习了:https://www.cnblogs.com/shangxiaofei/p/6211367.html 使用异步方法进行方法调用 ...
- async = require('async')
var mongoose = require('mongoose'), async = require('async'); mongoose.connect('localhost', 'learn-m ...
- c#同步調用異步(async)方法【記錄用】
使用RestSharp中的異步方法ExecuteTaskAsync<T>編寫寫了一個異步方法,功能很簡單:異步調用API,返回結果,假設為GetAccessToken,方法簽名假設如下: ...
随机推荐
- Chrome——F12 谷歌开发者工具详解
我们这里介绍主要的几块:Console.Source.Network Console 大家都有用过各种类型的浏览器,每种浏览器都有自己的特色,本人拙见,在我用过的浏览器当中,我是最喜欢Chrome的, ...
- KiCad 的 Digikey 元件库
KiCad 的 Digikey 元件库 KiCad 最初由法国人Jean-Pierre Charras于1992年推出,目前由 CERN(欧洲核子研究组织)接手开发. 而且现在有很多大公司的加入,比如 ...
- 艰苦的编译boost python (失败)
1.下载 boost_1_67_0 2.在目录下执行 bootstrap 3.将python36添加到path环境变量 4.执行 b2 --with-python,将会声场如下dll 2018/04/ ...
- 配置hive元数据数据库
<configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <v ...
- Maven+Eclipse+SparkStreaming+Kafka整合
版本号: maven3.5.0 scala IDE for Eclipse:版本(4.6.1) spark-2.1.1-bin-hadoop2.7 kafka_2.11-0.8.2 ...
- centos 6.X 安装nodejs v6.11.0和npm
下载nodejs wget -c https://nodejs.org/dist/v6.11.0/node-v6.11.0-linux-x64.tar.xz 安装gcc++ yum install - ...
- linux 如何运行rpm
rpm -ivh linuxqq-v1.0.2-beta1.i386.rpm
- 美剧黑名单的插曲《Jolene》
网易上有Slowdown 版本.<Jolene>Dolly Parton
- WebService发布到IIS
发布WebService 第一步:选择项目右键发布 第二步:选择文件系统.目标位置(即,发布后文件保存位置) 单击发布 将WebService发布至IIS 第一步:打开IIS 右键添加网站--填写网站 ...
- sqlserver统计日志数目
SELECT COUNT(1) FROM [sys].[fn_dblog](NULL,NULL)