2011-10-04 50 views
0

我有一些WCF服務服務的方法LongTimeMethod。爲避免請求超時,我下一步做:Wcf中的線程

public void LongTimeMethod(...) 
    { 
     Thread t = new Thread(delegate() { 
      LocalLongTimeMethod(...); 
     }); 
     t.IsBackground = true; 
     t.Start(); 
    } 

    private void LocalLongTimeMethod(...) 
    { 
     SomeOperations(); 
    } 

之後,SomeOperations運行速度快了10倍(!?)。 SomeOperations的結果是正確的。那麼原因是什麼,這是否正常?

還有一個問題:服務實例活着,而我的線程還沒有完成?

回答

4

那麼是什麼原因,這是正常的?

該方法不太可能執行10倍。由於你的WCF操作是void - 你沒有返回任何東西。相反,引言是線程允許WCF操作完成,並且它將繼續在不同的線程上處理您的工作。

所以你調用你的WCF操作,它觸發一個線程,並完成。它不會等待線程完成。如果客戶端同步地調用操作,即使後臺線程仍在那裏完成所有工作,它似乎已經完成到客戶端。

這通常被稱爲「繼續燃燒」。

WCF內置的一個更好的選項是創建一個One Way Contract

服務實例活着,而我的線程還沒有完成?

最有可能的是。

+0

+1着火而忘記。添加了有關不從服務器進程創建線程的其他信息。 – bryanmac

+0

當我說方法執行速度快10倍時,我的意思是秒錶的結果。我在SomeOperations()之前啓動它並在其執行後停止。我試過單向合同,結果是(例如)下一個:正常執行 - 3分鐘,使用單向合同 - 3分鐘,使用線程 - 30秒。重要的是我在**線程內使用了Stopwatch **。 –

1

除了vcsjones說過的話,如果你打算忘了,在服務器端使用ThreadPool.QueueUserWorkitem。不要創建一個線程。像ASP.net和WCF這樣的服務器進程有一個線程池,這使得它更有效率(創建一個線程分配1MB的線程存儲等),但更重要的是,它確保了一大堆請求不會使你的服務器 - 而是阻止等待從池中獲取線程。