出于某种原因,当我在后台线程中进行长时间运行的Web服务调用(无论是遗留的还是WCF)时,它似乎锁定了UI主线程。
我无法看到插入的代码有什么问题。
workerThreadInitialNotify = new BackgroundWorker();
workerThreadInitialNotify.WorkerSupportsCancellation = true;
workerThreadInitialNotify.DoWork += new DoWorkEventHandler(workerThreadInitialNotify_DoWork);
workerThreadInitialNotify.RunWorkerCompleted += new RunWorkerCompletedEventHandler(workerThreadInitialNotify_RunWorkerCompleted);
workerThreadInitialNotify.RunWorkerAsync();
然后在我做的工作中,我有一个像以下网络服务电话:
void workerThreadInitialNotify_DoWork(object sender, DoWorkEventArgs e)
{
if (!(sender as BackgroundWorker).CancellationPending)
{
try
{
TestWebService service = new TestWebService();
service.RunLongRunningMethod();
}
catch(Exception ex)
{
}
}
}
当调用此线程时,它偶尔会锁定UI线程,现在我已经设置了RunLongRunningMethod来故意运行slow和timeout(用于测试目的),但从技术上讲,这不应该完全锁定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:如果我将Web服务设置为本地托管到Win Forms应用程序,它运行正常,只有当webservice在另一个服务上运行时,才会发生奇怪的锁定。
ps(2):当后台线程在后台运行时,我正在使用devexpress库来控制表单,不确定这是否相关。我无法想象为什么,如果这是在一个单独的线程正确运行
答案 0 :(得分:0)
这最终成为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?