C#/.NET 异步操作会生成新线程吗

一个高频问题:异步操作会创建线程吗?

C#/.NET 异步操作会生成新线程吗

 总结:开不开启新的线程,主要取决于IO线程的状态.

1.要是IO线程被阻塞了,那么会开启新的线程

2.要是电脑的所有"逻辑处理器"12个线程都是在Running状态的话,就不会开启新的线程

开不开起新的线程基本取决与IO线程,如果核心数都是Running,那么不会开启新的线程;
如果IO线程被阻塞了(Lock,Sleep),把IO线程给卡住了,这时候要是不断的有新的WorkThread进入到任务队列的话,
这个时候就要生成新的IO线程去接收你的任务

 遇到 Sleep 或者 lock 情况

如果 t1 在执行的时候,遇到了 Sleep 或者 lock 锁时需要被迫停止,
此时系统会将 t1 线程送到 已暂停线程队列 中,
如果都 sleep 了,那 NumberOfConcurrentThreads 就会变为 0 ,

此时就会遇到无人可用的情况,那怎么办呢?
只能让系统从 线程池申请更多的线程来从 q1 队列中提取任务,
当某个时刻已暂停线程队列 中的线程激活,那么它又回到了 已释放队列 中继续执行任务,
当任务执行完之后,
再次调用 GetQueuedCompletionStatus 方法进去 已释放队列 等待线程队列。