【问题标题】:Background worker blocking UI when using web service call使用 Web 服务调用时后台工作人员阻塞 UI
【发布时间】:2013-05-14 19:14:10
【问题描述】:

由于某种原因,当我在后台线程中放置一个长时间运行的 Web 服务调用(不管它是旧版还是 WCF)时,它似乎锁定了 UI 主线程。

我看不出我输入的代码有什么问题。

workerThreadInitialNotify = new BackgroundWorker();
workerThreadInitialNotify.WorkerSupportsCancellation = true;
workerThreadInitialNotify.DoWork += new DoWorkEventHandler(workerThreadInitialNotify_DoWork);
workerThreadInitialNotify.RunWorkerCompleted += new RunWorkerCompletedEventHandler(workerThreadInitialNotify_RunWorkerCompleted);          

workerThreadInitialNotify.RunWorkerAsync();

然后在我的工作中,我有一个 web 服务调用,例如:

void workerThreadInitialNotify_DoWork(object sender, DoWorkEventArgs e)
{       
    if (!(sender as BackgroundWorker).CancellationPending)
    {
         try 
         {
             TestWebService service = new TestWebService();
             service.RunLongRunningMethod();

         }
         catch(Exception ex)
         {

         }
    }
}

当这个线程被调用时,它偶尔会锁定 UI 线程,现在我已经设置 RunLongRunningMethod 故意运行缓慢和超时(用于测试目的),但从技术上讲,这根本不应该锁定 UI 线程,因为它在一个单独的线程。

这是该方法包含的内容:

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["customConnection"].ConnectionString))
{
    conn.Open();

    using (SqlCommand cmd = new SqlCommand("TestDelay", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        try
        {
           cmd.ExecuteNonQuery();
        }
        catch (Exception ee)
        {

        }
    }        
}

TestDelay 存储过程只包含这个来模拟延迟,以便 Web 服务超时:

ALTER PROCEDURE [dbo].[TestDelay]

AS

WAITFOR DELAY '00:05:20';

奇怪的是,如果我在 dowork 中用Thread.Sleep(20000); 替换 Web 服务调用,它运行得很好,或者即使我放了一个长时间运行的 while 循环,它也运行得很好。

我不知道为什么 web 服务会特别锁定 UI。

ps:如果我将webservice设置为本地托管到Win Forms应用程序,它运行正常,只有当webservice在另一个服务上运行时,才会发生奇怪的锁定。

ps (2):当后台线程在后台运行时,我正在使用 devexpress 库进行表单的 ui 控件,不确定这是否相关。我无法想象为什么,如果这是在单独的线程中正确运行

【问题讨论】:

  • 你有TestWebService.RunLongRunningMethod()的来源吗?
  • 源中的内容重要吗?它是一个长时间运行的 Web 服务,只需调用一个存储过程,其中有一个等待延迟,因此它故意超时
  • 我问是因为这会锁定 UI 线程的唯一原因是 RunLongRunningMethod 是否正在 UI 线程上执行某些操作(或以其他方式阻塞它;无论哪种方式,问题都出在该方法中)。
  • 当它是另一个服务器上的 Web 服务时,它怎么能在 UI 线程上执行某些东西呢?它甚至不能引用 UI 线程
  • 您提供的代码示例表明RunLongRunningMethod 是问题存在的唯一合乎逻辑的位置。它可能在等待来自服务器的响应的 UI 线程上调用委托。它可能会锁定 UI 线程也尝试访问的资源。这可能是任何数量的问题。最重要的是,我们需要更多信息来回答您的问题。

标签: windows multithreading winforms devexpress backgroundworker


【解决方案1】:

这最终成为 App.config 中的 maxconnection .net 设置(微软默认为非常低的 2)

<system.net>
   <connectionManagement>
      <add address="*" maxconnection="40"/>
    </connectionManagement>
</system.net>

现在设置为 40,问题已经消失。

有多个线程同时运行,每个线程都调用web服务,每个线程都互相阻塞。

这些链接中有更多信息: http://blogs.msdn.com/b/adarshk/archive/2005/01/02/345411.aspx

What is limiting the # of simultaneous connections my ASP.NET application can make to a web service?

http://msdn.microsoft.com/en-us/library/fb6y0fyc.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多