首页 > 编程语言 >C# 异步编程Task(三) async、await

C# 异步编程Task(三) async、await

时间:2024-04-20 16:44:41浏览次数:20  
标签:异步 Task Console C# await WriteLine async

一、async和await两个修饰符

C#5.0的时候引入了async和await两个修饰符,成为异步编程的核心关键字。
async 是修饰符,表明方法含有异步操作,但并不是说整个方法是异步的。async修饰的方法会先同步执行到第一处await的地方而后开始异步。
await可以理解为一异步特有的“return”。即返回一个正在运行的异步过程。并且等待该异步过程结束后再继续向await的下一句运行。

 

private static async void MainAsync()
{
    Console.WriteLine("Application Start");
    await AsyncTask1();//编译报错,“无法等待void”
    Console.WriteLine("Application End");
}

private static async void AsyncTask1()
{
    Console.WriteLine("AsyncVoid1");
    Thread.Sleep(1000);
    Console.WriteLine("AsyncVoid1: befor await");
    await Task.Run(() =>
    {
        Console.WriteLine("AsyncVoid1: Task Runing");
        Thread.Sleep(2000);
    });
    Console.WriteLine("AsyncVoid1: after await");
}
static void Main(string[] args)
{
     //控制台Main入口不能加async
      MainAsync();
}
//方法内有await时,方法必须被async修饰。
private static async void MainAsync()
{
    Console.WriteLine("Application Start");
    await AsyncTask1();
    Console.WriteLine("Application End");
}

运行结果:

Application Start
AsyncVoid1
AsyncVoid1: befor await
AsyncVoid1: Task Runing
AsyncVoid1: after await
Application End

 

二、异步返回类型

async是方法的修饰,其对应的方法的返回值有

void
Task
Task<T>
任何具有可访问的 GetAwaiter 方法的类型(GetAwaiter 方法返回的对象必须实现 ystem.Runtime.CompilerServices.ICriticalNotifyCompletion 接口)。
IAsyncEnumerable(对于返回异步流的异步方法)。
常用的是前三个。暂且置整理前三者的区别与不同。



三、async Task
返回Task类型的。个人概括的说,就是“执行操作但不返回任何值的异步方法”。即await 等待的一个无返回值的Task。

private static async Task<int> AsyncFuncReturn1()
{
    await Task.Run(() => 
    { 
        Thread.Sleep(500); 
    });            
    return 1;
}
private static Task<int> AsyncFuncReturn2()
{
    return Task<int>.Run(() => 
    { 
        Thread.Sleep(500); 
        return 1; 
    });
}

 

四、await 和 Task.Wait()/Task.Result

await 和Task.Wait()的作用都有等待任务结束的功能,不同的是,就想前面说的,await还有一层“return”的意思,或者说更像“yield”。即让await所在方法的被调用者可以继续下一步操作。(这里只是说“可以”,即对外产生这样的能力,而如果await所在方法返回的值是void类型,调用者就不能强制同步了)

 

更多:

C# 异步编程Task整理(一)

C# 异步编程Task整理(二)异常捕捉

C# 最简单的使程序单进程运行的方法

 

标签:异步,Task,Console,C#,await,WriteLine,async
From: https://www.cnblogs.com/tianma3798/p/18147855

相关文章

  • 35-windows通过cmd查看端口占用,并停止该端口,杀死进程kill等命令
     1)cmd命令提示符窗口后,输入“netstat-ano”并按下回车执行,之后就会显示电脑上运行的所有端口号netstat-ano 2) 如果已知被占用的端口时,可以用命令netstat-aon|findstr8109直接找到端口号为7009的进程,PID为36304 netstat-aon|findstr8019 3) 根据PID进......
  • VSCode非活跃预处理程序块Inactive颜色设置(底色字色透明度)
    VSCode非活跃预处理程序块——#if0非活跃预处理程序块#else活跃预处理程序块#endif#if1活跃预处理程序块#else非活跃预处理程序块#endif 效果 ......
  • 笔记本重装系统后重装OFFICE(预装的,赠送的)
    笔记本重装系统后重装OFFICE(预装的,赠送的) 1、首先用edge打开bing搜索微软账号,谷歌浏览器也行就是登录微软账号多了一步2、进去后点击服务和订阅那一栏,然后可以看到自己已购买的产品。再选择一个版本进行安装3、确认好语言和版本后直接点安装它会下载好office的安装包。点击安......
  • 「主席树维护高精度」 CF464E The Classic Problem
    发现难点在于维护\(dis_u\)(起点\(s\)到\(u\)的最短路)。如果使用暴力高精度,复杂度会乘上一个\(len\)。考虑边权\(2^w\)的特殊性质,如果使用一个二进制串来维护\(dis\),那么加上边权\(2^w\)相当于将二进制下某一段\(1\)置为\(0\),然后再将一个\(0\)置为\(1\)。说白了......
  • code
    /********************************************************************filename: main.cauthor :[email protected] :2024/04/07function:设计函数,三种方法赋值结构体note :NoneCopyRight(c)[email protected]......
  • Reflective journal
    ItwasmyfirsttimetomakeaDMCproject-videopresentation.WhenImadeit,IonlyusedapprochesthatIusedbefore.However,Ifounditalittlebitboring.And,itisdifficulttoappealone’sinterestandattention.Tosolvethisproblem,Iaddedsomepi......
  • 杂项:输入流和memcpy
    输入流c++中常用cin接受输入,在C中可以定义main函数intmain(intargv,char*argc)来接受参数数量和参数字符串在c++中可以通过接受字符串流的方式,分段处理输入的字符串//接受输入的字符串readtext123stringline;getline(cin,line);//变为输入流istringstreamiss(......
  • AutoCAD C# 在编程中使用字段表达式
    CAD中有些文字需要随着图纸的当前条件的变化自动变化,例如保存日期、打印日期、打印比例等等。CAD早期版本只是在扩展工具中提供了动态反应文字(rtext)功能,动态反应文字可以用CAD的Diesel表达式来定义动态文字,也可以动态链接文本文档,文本文档被编辑后,图纸中的文字会自动更新。由于......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——服务端注册实现原理分析
    远程过程调用RPC——服务端注册实现原理分析rpcserver代码参考我前一篇博文:https://www.cnblogs.com/zuoyang/p/18146870RPCServer端的RPC代码架构主要由两大部分构成:第一部分是服务方法的注册过程。在这个过程中,我们首先通过调用rpc.Register接口将服......
  • typescript安装问题=> for (let i = startIndex ?? 0; i < array.length; i++) {
    for(leti=startIndex??0;i<array.length;i++){^SyntaxError:Unexpectedtoken?atObject.exports.runInThisContext(vm.js:76:16)atModule._compile(module.js:542:28)atObject.Module._extensions..js(mo......