线程存储过程会拖延整个应用程序

时间:2014-04-08 11:23:38

标签: c# multithreading stored-procedures

对此感到好奇。我的应用程序的一部分调用存储过程,根据具体情况,存储过程运行相对较慢。

因此,我将调用包装在一个线程中,以使用户能够浏览到应用程序的其他部分,并在SP执行时执行其他一些工作。当流程完成后,RunWorkerCompleted进程会向用户发送一封电子邮件,提醒他们该作业已完成:

bgw = new BackgroundWorker();
bgw.DoWork += new DoWorkEventHandler(
   delegate(object o, DoWorkEventArgs args)   
   {  rep.spCount(); }
bgw.RunWorkerCompleted += bgw_RunWorkerCompleted;
bgw.RunWorkerAsync();

在不会导致SP特别苛刻的条件下,这可以按预期工作。但是,如果SP有很多工作要做,并且用户在运行时尝试导航,那么应用程序的其他部分运行速度非常慢,通常会完全停止,直到线程完成。

让我感到困惑的是,我曾假设在数据库端发生了繁重的工作,而这个数据库运行在一个完全独立的服务器上 - 所以这个线程真的不应该要求很多处理能力用户的机器。

那么 - 为什么数据库服务器上的大量存储过程负载会导致应用程序在用户的本地计算机上停滞 - 并且 - 如果没有调整sproc - 我能做些什么吗?

编辑:这个EF问题解释了发生了什么 - 我有一个objectContext而且EF并不擅长通过同一个Context处理多个线程。明智的是,因为它会导致并发问题:

c# working with Entity Framework in a multi threaded server

1 个答案:

答案 0 :(得分:2)

  

如果SP有很多工作要做并且用户尝试导航   当它运行时,应用程序的其他部分运行速度极慢,   经常完全拖延

当sp正在运行时,其他数据库调用可能被阻塞或缺乏资源,导致应用程序的不相关部分变得迟缓。

尝试在存储过程运行时尝试导航应用程序时运行sql server profiler。也许你会发现一个sql语句执行异常缓慢,因为sp同时运行。