2016-09-26 88 views
0

我有一個自託管的命名管道(不使用http)wcf託管在類庫中。我可以通過以下方法類庫啓動WCF:從它自己的類構造函數啓動WCF

ServiceHost serviceHost; 
public void startService() 
{ 
    // Create the service host 
    ... 
    // Open Service Host 
    serviceHost.Open(); 
} 

然後從一個WinForms測試程序運行從一個按鈕,單擊下列項目:

MyClassLib.MySvc testSvc; 
private void button2_Click(object sender, EventArgs e) 
{ 
    testSvc = new MyClassLib.MySvc(); 
    testSvc.startService(); 
} 

這並不正確啓動在類庫中運行的WCF。

但是這需要引用類庫的winforms調用startService方法。

我希望能夠在運行WCF的類庫的引用完成後立即啓動服務。

我嘗試添加類庫中的服務的構造函數如下:

public MySvc() 
{ 
    startService(); 
} 

再從WinForms的實例:

MyClassLib.MySvc testSvc; 
private void button2_Click(object sender, EventArgs e) 
{ 
    testSvc = new MyClassLib.MySvc(); 
    //testSvc.startService(); //No need to call this 
} 

如果我調試的代碼,我可以看到,在事實上它確實在這一點上打破:

public MySvc() 
{ 
    startService(); // It does run this but service does not start 
} 

但是,這並不運行該服務。任何幫助,將不勝感激。

注意#1:我相信它的某些類型的時間問題,它不讓你在構造函數方法中啓動服務,但不確定。

+0

您有'MySvc',但在你的代碼是什麼正在調用構造函數構造函數? (提示:可能沒有)。你需要一些入口點。看看你的Winforms應用程序。有一個帶有靜態「Main」方法的Program.cs文件。這是入口點。 – helrich

+0

構造函數是類庫中服務類的名稱。當我從winforms實例化類庫時,它被調用。它甚至會調用startService方法,但服務不會以這種方式啓動。 –

回答

1

問題已解決,是的,我認爲這是一個時間問題(請參閱注意#1以上)是正確的!

進行復制,改變這種:

public MySvc() 
{ 
    startService(); // It does run this but service does not start 
} 

爲了這一點,問題就迎刃而解了:

public void delayStartService() 
{ 
    Task.Delay(1000).ContinueWith(t => startService()); 
} 

public MySvc() 
{ 
    delayStartService(); 
} 
+0

'Task.Delay(1000).ContinueWith'這是否讓你感覺正確?爲什麼是1000?爲什麼不是10或10000?它會在每次運行中工作嗎?... –

+0

它讓我感覺正確嗎?它會讓你感覺正確嗎?磅。隨時爲自己的用途做進一步的測試。如果您願意,也可隨時發佈更好的解決方案。 –

+0

我可以發佈一個不依賴於經驗時間的更好的方法,但不能在此響應之後發佈......使用您的解決方案。 –