2015-04-04 91 views
2

在Windows服務託管的WCF服務中創建後臺線程是否是一種很好的做法?WCF中的後臺線程

事情是這樣的:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)] 
public class Service : IService 
{ 
    private void DoWork() 
    { 
    ... 
    } 

    public Service() 
    { 
     Thread thread = new Thread(new ThreadStart(DoWork)); 
     thread.Start(); 
    } 
} 
+1

不,我建議只使用** per-call **服務模型 - 每個請求都會獲得自己的服務類副本,調用該服務方法,然後再次釋放該實例。這並不需要處理棘手的線程安全問題和類似的東西 – 2015-04-04 18:08:12

+0

我的服務正在運行並偵聽網絡並通過Web API將消息發送到MVC服務器。對於per-call服務,我需要在MVC和雙工通信中創建後臺線程..所以我更喜歡在WCF中創建後臺線程並將消息推送到MVC。你能解釋一下,爲什麼這是一種不好的做法? – Michael 2015-04-04 18:39:09

+0

後臺線程會做什麼?它爲什麼需要存在? – usr 2015-04-04 19:03:09

回答

1

所以,你有一個持續的過程,從一些源和中繼它拉的數據。對於WCF中的後臺線程來說,這是一個很好的例子,因爲您的工作不是基於傳入呼叫,而是無法做到。

請注意,由於無法控制的原因,IIS工作進程可能會在任何時間點關閉。而且,工作流程在回收時可能會重疊。這意味着在同一個框中,這個線程的兩個實例可以同時運行。出於HA原因,如果您想在多臺機器上運行此應用程序,情況也是如此。

Windows服務更穩定,但它們也必須可重新啓動(例如,部署時或存在導致進程崩潰的錯誤時)。

此外請確保捕獲該線程上發生的任何錯誤。未處理的異常會在不通知開發人員的情況下殺死進程。

既然你是在一個Windows服務託管,我看到沒有理由維護Service類的構造函數中的線程。保持WCF之外的狀態。例如在你的Windows服務類中。

+0

究其原因,我在WCF創建線程,那我就可以殺死它,並通過創建WCF接口一個新的。例如:public void StopListening(){thread.Abort();}和public void StartListening(){thread = new Thread(new ThreadStart(DoWork)); tread.start(); } ... – Michael 2015-04-05 12:23:26

+1

如果將線程存儲在其他地方,則可以執行相同的操作。不需要混淆WCF實例化模式。還要注意,那個thread.abort是邪惡的。這不是一個可行的架構。 – usr 2015-04-05 12:27:16