2012-08-10 30 views
2

我需要強制我的WCF服務在單個線程中運行,因爲內部操作取決於不支持多線程調用的傳統COM對象。如何強制WCF服務只使用一個線程?

然後我寫了下面的示例代碼,但如我所料:(

[ServiceContract] 
public interface ITestService 
{ 
    [OperationContract] 
    void TestAction(); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode =  ConcurrencyMode.Single)] 
public class TestServiceImp : ITestService 
{ 
    void TestAction() 
    { 
     Trace.WriteLine("Entering method TestAction, Thread={0}" + Thread.CurrentThread.ManagedThreadId); 
     //... 
     Trace.WriteLine("Leaving method TestAction, Thread={0}" + Thread.CurrentThread.ManagedThreadId); 
    } 
} 

真正的結果是一樣的東西下面,

進入它不工作方法TestAction,線程= 4

離開方法TestAction,線程= 4

輸入方法TestAction,線程= 5

離開方法TestAction,線程= 5

輸入方法TestAction,線程= 8

離開方法TestAction,線程= 8

雖然我的期望是,

輸入方法TestAction,線程= 4

離開方法TestAction,線程= 4

輸入方法TestAction,線程= 4

離開方法TestAction,線程= 4

進入方法TestAction,Thread = 4

保留方法TestAction,線程= 4

我怎麼能得到我想要的東西?謝謝。

+0

我可以建議這個答案几乎相同的問題:[c# - 強制WCF使用一個線程 - Stack Overflow](http://stackoverflow.com/questions/20000078/force-wcf-to-use-one-線程/ 20010432#comment51204132_20010432) – 2015-07-25 16:11:57

回答

1

將InstanceContextMode聲明爲「Single」意味着來自不同客戶端的每個調用都將在同一個實例上執行,但負責執行的線程由線程池管理。

基本上,如果你爲每個調用使用併發模式「Single」(默認配置),一個線程將從線程池中取出,使用並返回給它,所以有可能線程是相同但不能保證

如果您想要管理對非線程安全資源的訪問,您應該手動執行此操作,以定義哪個線程將執行您的服務實例,而不是使用 的SynchronizationContext

http://nevmehta.blogspot.ch/2006/12/what-is-usesynchronizationcontext.html

http://msdn.microsoft.com/en-us/magazine/gg598924.aspx

希望這有助於 馬爾科

+0

我明白了。非常感謝! – 2012-08-13 02:26:06

0

從微軟的另一個很好的資源:

Concurrency Management

在我來說,我結束了使用基於服務類型的鎖:

lock (typeof(MyServiceType)) { 
... 
} 

上設置單ConcurrencyMode時要小心使用EntityFramework上下文的WCF服務,因爲服務及其資源在線程被終止之前不會被處理,最終會導致讀取操作的未更新數據。

相關問題