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,方法簽名假設如下: ...
随机推荐
- 纹理,这次没用Shader头文件,但是没有报“超出内存”的错误,不知道为什么
#include <iostream> using namespace std; //using std::cout; using std::cin; using std::endl; # ...
- 关于svm
svm的研究一下,越研究越发现深入.下面谈一些我个人一些拙见. svm计算基础是逻辑回归(logistic regression),其实一切二元分类的鼻祖我觉得都是logistic regress. ...
- EntityFrameworkCore操作记录
Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design -Version 2.0.3 Add-Migration Init U ...
- ionic cordova platform --help
ionic platform add android 给我报这个问题,不理解 The platform command has been renamed. To find out more, run: ...
- Xilinx FPGA开发环境vivado使用流程
Xilinx FPGA开发环境vivado使用流程 1.启动vivado 2016.1 2.选择Create New Project 3.指定工程名字和工程存放目录 4.选择RTL Project 5 ...
- JavaScript学习总结(二、隐式类型转换、eval())
一.(避免)隐式类型转换 console.log(false == 0); //logs true; console.log(false === 0); //logs false; conso ...
- Thinkphp 3.1. 3 ueditor 1.4.3 添加水印
1.引入Ueditor <!-- 实例化编辑器 --> <script type="text/javascript"> window.UEDITOR_HO ...
- HelloStruts
Hello Struts 建立项目 打开myeclipse 新建项目 选择myeclipse-java enterprise projects-web project 项目名称:hellostruts ...
- win7环境下安装composer
以前python有pip,但是PHP一直没有好的包管理工具,不过现在php也有比较好的包管理工具了,那就是composer 1:下载地址:https://getcomposer.org/downloa ...
- 同台同时多开DELPHI2007的解决办法
Cannot create file "C:\Users\Administrator\AppData\Local\Temp\EditorLineEnds.ttr"这个问题的产生根据 ...