不是特殊的,都是池子(线程池)里的
谢谢dudu,
对于异步可以提高并发量 webapi 请求线程 到await 释放webapi 线程 ,操作等待,如果 await里面task.run线程 ,虽然 webapi请求线程释放了,但是await 又创建了线程 ,这样如何提高了并发量 ,如果异步方法不创建线程我理解,可以提高并发量。 我在博客园 很多大哥博客里面 看到 webapi请求线程是特殊的线程池 ,异步方法里面如果使用线程是廉价的线程。。
希望dudu可以解答
@narojay: await
的作用是释放当前线程
@dudu: 对 我明白释放的是当前线程 但是如果异步方法创建了线程 线程池的线程不是也会减少吗?
@narojay: 参考 https://q.cnblogs.com/q/116814/
@dudu: 这个链接是这个博问.
@narojay: 除非你在异步方法使用 Task.Run 这样的方法专门使用了新的线程,否则异步方法并不会创建线程
@narojay: 已修正了链接
@dudu: 如果我在异步里面创建线程 是否会影响异步提高并发量的作用
@narojay: 会消耗更多的线程,对系统的并发吞吐量有影响
@dudu: 明白了 ,那么这几个博客园的大哥博客有点 问题 请求webapi并不是在特殊的线程池里面。
感谢两位
换个例子,1个请求到你的api,消耗掉线程池1个线程,请求到达 await File.ReadAsync(). 这个时候要等待IO的完成,这里的IO指得是系统api走硬件到磁盘的IO,那遇到await后,请求会把这个线程返回给你的应用程序线程池(线程池所有线程都空闲了)。等IO完成后,在从线程池拿一个线程继续后续的步骤。
在这个等待的过程中就不需要占着一个线程不用浪费了对不。
上面说的IO可以是文件IO,网络IO等都是一个道理。
假设你的代码是类似下面的,那await毫无意义。
Api:
await yourTask();
Task yourTask(){while(true){//3秒后退出}}
对 我理解io那种情况,那种异步不会创建线程 api线程直接返回 ,可以提高并发量,
那么是否可以说如果异步创建了线程 并不会提高并发量。不是io情况的话。
@narojay: 是的,而且会降低性能,因为线程的上下文切换也是有代价的。
yourTask();
yourTask(){while(true){//循环3秒后退出}}
上面这个比下面这个性能更好。少了一次线程的切换。
await yourTaskAsync();
Task yourTaskAsync(){while(true){//循环3秒后退出}}
如果你要测试,可以考虑
await yourTaskAsync();
Task yourTaskAsync(){
await Task.Yield();//切换线程
var sw = Stopwatch.Start()
while(sw.total> 3){}
//Or Task.Run(()=>{})
}