进行数据库操作时线程是否被阻塞?

时间:2015-07-13 14:42:23

标签: c# multithreading wcf threadpool

我们有一个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周期或线程处于等待状态(等待中断)?

2 个答案:

答案 0 :(得分:3)

是的,它被阻止了。有async个方法用于将线程返回到侦听池,并在完成任务时从线程池中检索新的(或相同的)线程。非async方法将阻止您的调用线程。

答案 1 :(得分:2)

  

此线程是否阻塞并占用CPU周期或将线程进入   等待状态(等待中断)?

它正在等待中断,并且不会消耗任何CPU周期。当您发出IO请求时,请求会一直下降到相关的设备驱动程序(或您的情况下的数据库进程),这本质上是异步的。这些IO请求通常注册IRP(IO请求包)。在数据库的情况下,线程将阻塞并等待中断以便恢复。

SqlAdapter仅仅是使用SqlDataReader(至少是它的同步API)的包装器,它在内部确实暴露了ReadAsync和{{3}等异步方法使用Task Asynchronous Pattern。而不是不必要地使用新线程,请使用这些API。