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,方法簽名假設如下: ...
随机推荐
- 最大值最小值(max,max_element)
min 如果比不出大小就返回第一个引数 //版本一:调用operator< template <class LessThanComparable> const LessThanCom ...
- SUPERSOCKET 客户端
SUPERSOCKET.CLIENTENGINE 简单使用 2015年5月27日 HYJIACAN 发表回复 阅读 11,105 次 江大没有给ClientEngine的Demo,一直没有找到其它的. ...
- tomcat源码阅读之Tribes.RpcChannel
一.RpcChannel简介: 1.RPC即远程过程调用,它的提出旨在消除通信细节.屏蔽繁杂且易错的底层网络通信操作,像调用本地服务一般地调用远程服务,让业务开发者更多关注业务开发而不必考虑网络.硬件 ...
- mongodb之 复制集维护小结
原文地址:https://www.cnblogs.com/zhaowenzhong/p/5667312.html 一.新增副本集成员 1.登录primary 2.use admin >rs.ad ...
- C166 结构按字节访问的设置
PACK Compiler Directive Home » Compiling Programs » Directives » Reference » PACK Abbreviation None. ...
- Centos6.8 Mysql5.6 安装配置教程(转)
准备Mysql文件: 方式一:wget url(mysql下载地址); 方式二:从官网下载mysql,上传至centos(小编使用的Nodepad++的NppFTP具体做法请百度); 检查之前安装 ...
- java实现文件的上传和下载
1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ...
- Win10+Ubuntu1604双系统
原本电脑有一块固态硬盘和机械硬盘,用来跑win10的,现在想直接在ubuntu上跑tensorflow,所以加了块320G的机械硬盘单独跑ubuntu. 一.准备 1.ubuntu-16.04.3-d ...
- Video to SDI Tx Bridge模块video_data(SD-SDI)处理过程
Video to SDI Tx Bridge模块video_data(SD-SDI)处理过程 1.Top Level Block Diagram of Video to SDI TX Bridge V ...
- DateGridView标题列头添加复选框
第一:添加列标题时,添加两个空格——用于显示复选框: 第二:实现列标题添加复选框,代码如下: private void AddCheckeBoxToDGVHeader(DataGridView dgv ...