我们有一个WCF服务(部署在IIS上),可以对数据库进行昂贵的调用。它不使用任何类型的异步peogramming(async \ await)。
using (SqlDataAdapter adapter = new SqlDataAdapter())
{
using (SqlCommand command = new SqlCommand())
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "StoreProcedure_NAME"; //Takes 6 seconds
command.Connection = connection;
adapter.SelectCommand = command;
adapter.Fill(dataset);
return dataset;
}
}
现在,线程会发生什么(我相信这是一个wcf线程池线程)在6秒的等待时间内对数据库进行调用。该线程是否阻塞并占用CPU周期或线程处于等待状态(等待中断)?
答案 0 :(得分:3)
是的,它被阻止了。有async
个方法用于将线程返回到侦听池,并在完成任务时从线程池中检索新的(或相同的)线程。非async
方法将阻止您的调用线程。
答案 1 :(得分:2)
此线程是否阻塞并占用CPU周期或将线程进入 等待状态(等待中断)?
它正在等待中断,并且不会消耗任何CPU周期。当您发出IO请求时,请求会一直下降到相关的设备驱动程序(或您的情况下的数据库进程),这本质上是异步的。这些IO请求通常注册IRP(IO请求包)。在数据库的情况下,线程将阻塞并等待中断以便恢复。
SqlAdapter
仅仅是使用SqlDataReader
(至少是它的同步API)的包装器,它在内部确实暴露了ReadAsync
和{{3}等异步方法使用Task Asynchronous Pattern
。而不是不必要地使用新线程,请使用这些API。