根据我的理解,async和await所做的主要事情之一是使代码易于编写和阅读-但使用它们是否等于生成后台线程来执行长时间的逻辑?
我目前正在尝试最基本的例子。我内联添加了一些注释。你能给我解释一下吗?
// I don't understand why this method must be marked as `async`.
private async void button1_Click(object sender, EventArgs e)
{
Task<int> access = DoSomethingAsync();
// task independent stuff here
// this line is reached after the 5 seconds sleep from
// DoSomethingAsync() method. Shouldn't it be reached immediately?
int a = 1;
// from my understanding the waiting should be done here.
int x = await access;
}
async Task<int> DoSomethingAsync()
{
// is this executed on a background thread?
System.Threading.Thread.Sleep(5000);
return 1;
}
根据我的理解,async和await所做的主要事情之一是使代码易于编写和阅读。
它们是为了让异步代码易于编写和阅读。
这和生成后台线程来执行长时间逻辑是一样的吗?
一点也不。
//我不明白为什么这个方法必须被标记为'async'。
async关键字启用await关键字。所以任何使用await的方法都必须被标记为async。
// DoSomethingAsync()方法在5秒休眠后到达该行。难道不应该立即到达吗?
不会,因为异步方法默认情况下不会在另一个线程上运行。
//是否在后台线程上执行?
No.
你可能会发现我的async/await介绍很有用。官方MSDN文档也非常好(尤其是TAP部分),异步团队还发布了一个很好的FAQ。
这个答案旨在提供一些特定于ASP.NET的信息。
通过在MVC控制器中使用async/await,可以提高线程池的利用率,并实现更好的吞吐量,如下文所述。
http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4
在web应用程序中看到大量的并发请求
启动或有突发负载(并发性突然增加),
使这些web服务调用异步将增加
应用程序的响应性。异步请求采用
处理同步请求所需的时间相同。例如,
如果一个请求进行了web服务调用,需要两秒钟才能完成
完成后,无论执行与否,请求都需要两秒钟
同步或异步。然而,在异步调用期间,
线程在运行时不会阻塞对其他请求的响应
等待第一个请求完成。因此,异步
请求阻止了请求队列和线程池的增长
调用长时间运行的操作的许多并发请求。
根据我的理解,async和await所做的主要事情之一是使代码易于编写和阅读。
它们是为了让异步代码易于编写和阅读。
这和生成后台线程来执行长时间逻辑是一样的吗?
一点也不。
//我不明白为什么这个方法必须被标记为'async'。
async关键字启用await关键字。所以任何使用await的方法都必须被标记为async。
// DoSomethingAsync()方法在5秒休眠后到达该行。难道不应该立即到达吗?
不会,因为异步方法默认情况下不会在另一个线程上运行。
//是否在后台线程上执行?
No.
你可能会发现我的async/await介绍很有用。官方MSDN文档也非常好(尤其是TAP部分),异步团队还发布了一个很好的FAQ。
回答你的第二个问题-何时使用async -这里有一个相当简单的方法,我们使用:
长时间运行的I/O绑定任务,运行时间超过50ms -使用异步。
长时间运行的cpu绑定任务——使用并行执行、线程等。
解释:当你在做I/O工作时——发送网络请求,从磁盘读取数据等——实际的工作是由“外部”硅(网卡,磁盘控制器等)完成的。一旦工作完成,I/O设备驱动程序将“ping”回操作系统,操作系统将执行你的延续代码,回调等。在此之前,CPU可以自由地做自己的工作(作为奖励,你还可以释放一个线程池线程,这对web应用程序的可伸缩性来说是一个非常好的奖励)
附注:50ms阈值是MS的推荐值。否则,异步所增加的开销(创建状态机、执行上下文等)会消耗掉所有的好处。现在找不到MS的原始文章,但这里也提到了https://www.red-gate.com/simple-talk/dotnet/net-framework/the-overhead-of-asyncawait-in-net-4-5/