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,方法簽名假設如下: ...
随机推荐
- 00centos安装
CentOS6.9及CentOS7.4的安装详细步骤 安装前的准备工作:1 VMware已经安装好2 镜像文件下载好(在这里,我用的是CentOS-6.9-x86_64-bin-DVD1.iso和Ce ...
- Understanding the managed heap
Understanding the managed heap Another common problem faced by many Unity developers is the unexpe ...
- 我发起了一个 .Net 开源 数据库 项目 SqlNet
大家好 , 我发起了一个 .Net 开源 数据库 项目 SqlNet . 项目计划 是 用 C# 写一个 关系数据库 . 可以先参考我之前写的 2 篇文章 : 谈谈数据库原理 https://w ...
- vue 下实现 echarts 全国到省份的地图下钻
vue 下实现 echarts 全国到省份的地图下钻 项目地址:https://github.com/cag2050/vue_echarts_v3_demo
- 五、springboot(二)配置数据源oracle
1.添加依赖 <!-- jpa --> <dependency> <groupId>org.springframework.boot</groupId> ...
- 二维指针的malloc内存分配(转)
写代码的时候会碰到多维数组的内存分配和释放问题,在分配和释放过程中很容易出现错误.下面贴上一些示例代码,以供参考. 如果要给二维数组(m*n)分配空间,代码可以写成下面: char **a, i; 1 ...
- Ribbon Ping机制
在负载均衡器中,提供了 Ping 机制,每隔一段时间,会去 Ping 服务器,判断服务器是否存活,该工作由 com.netflix.loadbalancer.IPing 接口的实现类负责,如果单独使用 ...
- max_result_window
PUT http://192.168.1.12:9200/_settings { "index": { "max_result_window": "1 ...
- [转] openwrt关闭调试串口
转自: http://wiki.wrtnode.com/index.php?title=Release_UART/zh-cn 由于mt7620n只有一个UART lite接口,在原生的OpenWrt中 ...
- 使用PHPMAILER实现PHP发邮件功能
第一步: 打开网址https://github.com/PHPMailer/PHPMailer/ 下载PHPMailer,PHPMailer 需要 PHP 的 sockets 扩展支持,而登录 QQ ...