0

由於某種原因,當我在後臺線程中放置長時間運行的Web服務調用(無論它是傳統服務調用還是WCF),它似乎都鎖定了UI主線。 。後臺工作人員在使用Web服務調用時阻止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服務使它鎖定用戶界面。

ps:如果我將web服務設置爲在本地託管到Win Forms應用程序,它將運行正常,只有當Web服務在另一服務上運行時,纔會發生奇怪的鎖定。 (2):我使用devexpress庫的ui控件的形式,而後臺線程在後臺運行,不知道這是相關的。我不能想象爲什麼,如果這是在一個單獨的線程正確

+0

你有'TestWebService.RunLongRunningMethod()'源? – JosephHirn

+0

它有什麼關係什麼來源?它是一個長期運行的Web服務,只是調用一個存儲過程,它有一個等待延遲,所以它故意超時 – Marty

+1

我問,因爲這將鎖定UI線程的唯一原因是如果'RunLongRunningMethod'在UI上執行的東西線程(或以其他方式阻止它;無論哪種方式,問題都在於此方法)。 – JosephHirn

回答

0

這結束了在App.config(它由微軟默認爲一個非常低2)MAXCONNECTION .NET環境

<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