Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 执行数据库操作时线程是否被阻塞?_C#_Multithreading_Wcf_Threadpool - Fatal编程技术网

C# 执行数据库操作时线程是否被阻塞?

C# 执行数据库操作时线程是否被阻塞?,c#,multithreading,wcf,threadpool,C#,Multithreading,Wcf,Threadpool,我们有一个WCF服务(部署在IIS上),可以对数据库进行昂贵的调用。它不使用任何类型的异步编程(async\await) 现在,在6秒钟的等待时间内调用数据库的线程(我相信这是一个wcf线程池线程)会发生什么情况。这是线程阻塞并占用CPU周期,还是线程将处于等待状态(等待中断)?是,它被阻塞。有async方法设计用于将线程返回到侦听池,并在任务完成时从线程池中检索新的(或相同的)线程。非async方法将阻止调用线程。是的,它被阻止。有async方法设计用于将线程返回到侦听池,并在任务完成时从线程

我们有一个WCF服务(部署在IIS上),可以对数据库进行昂贵的调用。它不使用任何类型的异步编程(async\await)


现在,在6秒钟的等待时间内调用数据库的线程(我相信这是一个wcf线程池线程)会发生什么情况。这是线程阻塞并占用CPU周期,还是线程将处于等待状态(等待中断)?

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

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

这个线程是否阻塞并占用CPU周期,或者线程是否处于 等待状态(等待中断)

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

SqlAdapter
仅仅是一个用于使用的包装器(至少是同步API),它在内部公开了异步方法,例如和使用
任务异步模式。使用这些API,而不是不必要地旋转新线程

这个线程是否阻塞并占用CPU周期,或者线程是否处于 等待状态(等待中断)

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


SqlAdapter
仅仅是一个用于使用的包装器(至少是同步API),它在内部公开了异步方法,例如和使用
任务异步模式。与其不必要地旋转新线程,不如使用这些API。

阻塞线程不占用CPU周期。阻塞线程不占用CPU周期。当它被阻塞时,该线程是否占用CPU周期(我在这里读到所有网络调用都是非阻塞的时问这个问题)?我使用的是ADO.Net,sqladapter不公开异步方法。我知道自己创建一个新任务并将此代码放入任务中有什么好处(我知道它释放了WCF线程池线程,但新线程仍然阻塞)吗?谢谢。@SriHarshaVelicheti否-一个线程必须正在执行CPU上计划的工作,从而占用周期。这些线程将进入等待状态。。。未计划和空闲(但阻塞),直到被告知带着长时间呼叫的结果返回。您应该利用
async
方法和回调,而不是
Task.Run
。如果我的问题很幼稚(我正试图对多线程有很好的理解),请原谅,如果我使用的是异步方法,BCL是否会在内部创建一个新线程,在该线程上完成数据库调用并在等待中断时被阻塞?@SriHarshaVelicheti异步/BCL的优点是它们使用IO完成线程,即低级OS线程来执行“阻塞”工作。它们将调用线程返回到线程池供其他人使用,然后当IOCP完成时,将从线程池中调用相同(或不同)的线程,以恢复执行代码并获得结果。当该线程被阻塞时,该线程是否占用cpu周期(当我从这里读到所有网络调用都是非阻塞的时,我问这个问题)?我使用ADO.Net,sqladapter不公开异步方法,有什么好处吗(我知道它释放了WCF线程池线程,但新线程仍然阻塞)在我自己创建一个新任务并将此代码放入任务中时。运行?谢谢。@SriHarshaVelicheti否-一个线程必须在CPU上执行计划的工作,从而占用周期。这些线程将进入等待状态…未计划和空闲(但阻塞)直到被告知使用长时间调用的结果返回。而不是
任务。运行
,您应该利用
异步
方法和回调。如果我的问题很幼稚,请原谅(我正在努力对多线程有很好的理解),如果我使用的是异步方法,BCL是否会在内部创建一个新线程,在该线程上完成数据库调用并在等待中断时被阻塞?@SriHarshaVelicheti异步/BCL的优点是它们使用IO完成线程、低级OS线程来执行“阻塞”工作。它们将调用线程返回到线程池供其他人使用,然后当IOCP完成时,从线程池中调用相同(或不同)的线程,以恢复执行代码并获得结果。
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;
    }
}