2009-05-31 71 views
3

這是一個新成員。很高興看到這樣一個整潔的社區。WCF :: ServiceHost:奇怪...即使線程死了仍然活着?

經過一番研究,我決定在我的應用程序中使用WCF來完成進程間通信,因此我使用NetNamedPipeBinding綁定。

ServiceHost託管應用程序不是專用服務器,所以它必須通過線程產生ServiceHost。到現在爲止還挺好。

所以我有類似如下:

Foo() 
{ 
    Thread serverThread = new Thread(new ThreadStart(ServerThread)); 
    serverThread.Start(); 
    Console.WriteLine("Foo Exited"); 
} 

ServerThread() 
{ 
    Uri baseAddress = new Uri("net.pipe://localhost/service"); 
    ServiceHost serviceHost = new ServiceHost(typeof(MyService), baseAddress); 
    ... 
    serviceHost.Open(); 
    Console.WriteLine("Server Thread Exited"); 
} 

所以不如預期,我看到:

-> Server Thread Exited 
-> Foo Exited 

但我驚訝的是,即使在服務器上運行的線程有興奮,客戶端仍然可以連接到serviceHost並且服務主機正確處理請求!

那麼即使主線程(它創建的線程)已經死機,ServiceHost如何處理和處理請求?

還有一個更好的方法來保持ServerThread活着然後一段時間(真){線程。休眠狀態(100);}?

謝謝。

回答

14

當您在ServiceHost上調用Open時,將創建一個額外的線程來偵聽傳入的服務請求。這樣,您的線程可能已經完成運行,但另一個線程已創建,並且將繼續運行,直到您在ServiceHost上調用「關閉」爲止。

在你的情況下,你可能不需要自己產生一個線程。只需在應用程序的主線程中打開ServiceHost。然後可以在主線程中執行其他操作,並在準備好終止主機時調用serviceHost.Close()。

這裏有一個很好的說明,我發現:

http://www.code-magazine.com/article.aspx?quickid=0701041&page=1

+0

這是正確的答案......我出票一天壽;) – TheSoftwareJedi 2009-05-31 20:20:47

+0

那麼,什麼是告訴它不是就像看起來那樣直截了當。 我jut寫了一個簡單的程序,沒有產生一個線程。在這個簡單的過程中,我創建了ServiceHost和Opened()它。之後,我創建了一個連接到服務主機的客戶端。客戶端失敗(我猜它是死鎖)。 如果我在單獨的線程上創建ServiceHost(即使線程退出),客戶端調用將成功。 那麼,如果Open()已經產生了處理線程,爲什麼客戶端調用會在同一個線程上失敗呢? – Futurist 2009-05-31 20:34:02

+0

你應該可以做到這一點,我只是寫了一個小測試程序,做你所描述和它的工作。你得到的錯誤是什麼?這可能是因爲你的app.config system.serviceModel部分沒有配置客戶端。 – 2009-05-31 20:59:24