由於某種原因,當我在後臺線程中放置長時間運行的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控件的形式,而後臺線程在後臺運行,不知道這是相關的。我不能想象爲什麼,如果這是在一個單獨的線程正確
你有'TestWebService.RunLongRunningMethod()'源? – JosephHirn
它有什麼關係什麼來源?它是一個長期運行的Web服務,只是調用一個存儲過程,它有一個等待延遲,所以它故意超時 – Marty
我問,因爲這將鎖定UI線程的唯一原因是如果'RunLongRunningMethod'在UI上執行的東西線程(或以其他方式阻止它;無論哪種方式,問題都在於此方法)。 – JosephHirn