概要
C#中的await运算符,因其不会阻塞主线程,可以给用户更好的操作体验,所以广泛的应用于各种C#的应用中。
本文主要分析其在Console程序,Winform程序和WebApi程序中,其工作行为的异同点,来更好的使用该运算符。
基本概念
await运算符的基本功能是挂起当前的async方法,并直到异步方法完成,并返回。
基本实现
挂起async方法最简单的方式就是将该方法放到一个新的线程中。
下面我们看一下await在不同应用中的基本行为:
Console
private static async Task doAsyncWork(){
await Task.Delay(2000);
PrintTreadNumber();
}
public static async Task Main(string[] args)
{
PrintTreadNumber();
await doAsyncWork();
PrintTreadNumber();
}
运行结果如下:
Current Thread Id is 1
Current Thread Id is 4
Current Thread Id is 4
从运行结果可以看出,await运算符的出现,让runtime启动了一个新的线程处理异步方法和异步方法后面的代码。
Winfrom
private static async Task doAsyncWork(){
await Task.Delay(2000);
PrintTreadNumber();
}
private async void btn_Click (Object sender, EventArgs e){
PrintTreadNumber();
await doAsyncWork();
PrintTreadNumber();
}
运行结果如下:
Current Thread Id is 1
Current Thread Id is 1
Current Thread Id is 1
从Winform的运行来看,一直是UI主线程在处理异步任务,runtime并没有为await后面的异步任务启动新的线程。
如果用ConfigureAwait方法强行启动子线程,代码如下:
private static async Task doAsyncWork(){
await Task.Delay(2000);
PrintTreadNumber();
}
private async void btn_Click (Object sender, EventArgs e){
PrintTreadNumber();
await doAsyncWork();
PrintTreadNumber();
}
private async Task doAsyncWork(){
await Task.Delay(2000).ConfigureAwait(false);
PrintTreadNumber();
}
运行结果如下:
Current Thread Id is 1
Current Thread Id is 5
Current Thread Id is 1
从运行结果可以看出,UI线程在调用doAsyncWork时候,当执行到 await Task.Delay(2000).ConfigureAwait(false),runtime启动了子线程完成异步运算, 因为调用了ConfigureAwait(false), 因此启动了新的线程,符合预期。
btn_Click 作为button的响应函数,考虑到里面可能有很多的UI操作,所以该响应函数直接与UI线程相关联。doAsyncWork后面并没有调用ConfigureAwait(false),代码等价于 await doAsyncWork().ConfigureAwait(true),表示后面的代码和await的代码共用一个线程,所以最后一个PrintTreadNumber打印线程号是1,即UI主线程的线程号。文章来源:https://www.toymoban.com/news/detail-603081.html
WebApi
await运算符在WebApi和Console中的行为基本一致,由于没有UI线程的限制,所以runtime会启动一个子线程来处理await操作符修饰的异步代码。文章来源地址https://www.toymoban.com/news/detail-603081.html
到了这里,关于浅谈C#中await运算符在不同类型应用中的不同行为的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!