2011-01-12 178 views
4

我正在做一個基本的自託管WCF服務,我只是想知道什麼最好的方法是讓它等待,而它接受請求?我找到的所有基本教程都只是簡單地使用Console.ReadLine來等待用戶點擊Enter退出。這對於真正的應用程序來說似乎不太實用。我試了一下(真);循環,但是這消耗了所有可用的CPU週期,所以它不是一個選項。我也嘗試了Thread.Sleep(0),但該服務在睡眠時不會接受請求,所以這也不起作用。我確定有一些常見的方法讓你的程序「失速」等待WCF請求;有誰知道如何?等待WCF服務的最佳方式?

我使用的是C#,.NET 3.5 SP1。

+0

值得注意的是,Thread.Sleep(0)只能休眠足夠長的時間,讓其他線程運行,然後返回。它不會有等待任何一段時間的效果。您可能已經註冊了Thread.Sleep(Timeout.Infinite)(值爲-1),該值將無限期阻止,但ManualResetEvent比此更好。 – Josh 2011-01-12 02:18:50

+0

相關提示謝謝您的幫助! – bunglestink 2011-01-12 02:23:23

回答

7

如果你在單獨的線程中運行(自從它自己託管),一個簡單的選擇是使用ManualResetEvent。

只需在WCF線程中調用manualResetEvent.WaitOne();即可。這將阻止(如Console.ReadLine),直到manualResetEvent.Set()從單獨的線程被調用。

這裏的好處是您可以擁有一個關閉服務的乾淨機制。

+0

美麗。這正是我所期待的。我會盡快將此作爲接受的答案。關機機制也很有幫助。 – bunglestink 2011-01-12 02:15:17

7

一個真正的應用程序,如果它沒有一個UI,可能會更好作爲一個Windows服務。您可以在服務的OnStart方法中設置WCF服務主機,然後在OnStop中將其關閉。

這些示例通常使用控制檯應用程序的原因是因爲它很容易演示而不會使讀者與無關代碼混淆以便安裝和運行服務。但是如果你的服務器沒有交互式用戶界面,我會建議調查Windows服務項目模板。

+1

他提到這是一項自我託管服務。這有很多實際用途,包括在Windows窗體應用程序中託管WCF服務等。這通常包括設置一個線程來託管WCF服務,並使用一些技術(如等待處理來防止它關閉)。 .. – 2011-01-12 02:17:07

+3

自託管服務只是意味着他引導WCF而不是IIS或其他主機進程。對於非交互式自託管服務,Windows服務是推薦的應用程序類型。 – Josh 2011-01-12 02:21:05

0

很容易讓WCF服務在控制檯應用程序中運行。我無法獲得自行託管的WCF在Windows服務中工作。可能太多的安全問題需要處理。爲了改進控制檯應用程序服務託管示例,我製作了一個AttachService方法,它可以像這樣在自己的線程上運行。

public static AutoResetEvent manualReset; 

// Host the service within this EXE console application. 
public static void Main() 
{ 
    manualReset = new AutoResetEvent(false); 

    ThreadPool.QueueUserWorkItem(AttachService); 

    //put Set() signal in your logic to stop the service when needed 
    //Example: 
    ConsoleKeyInfo key; 
    do 
    { 
    key = Console.ReadKey(true); 
    } while (key.Key != ConsoleKey.Enter); 
    manualReset.Set(); 
} 
static void AttachService(Object stateInfo) 
{ 
    // Create a ServiceHost for the CalculatorService type. 
    using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), new Uri("net.tcp://localhost:9000/servicemodelsamples/service"))) 
    { 
    // Open the ServiceHost to create listeners and start listening for messages. 
    serviceHost.Open(); 

    // The service can now be accessed. 

    //Prevent thread from exiting 
    manualReset.WaitOne(); //wait for a signal to exit 
    //manualReset.Set(); 
    } 
} 

我的目標是使用OnStart方法中使用Process類的Windows服務執行此控制檯應用程序。感謝@Reed Copsey對WaitOne()的建議。

相關問題