2010-02-04 90 views
0

我有以下配置的服務屬性WCF服務與ConcurrencyMode.Multiple和I​​nstanceContextMode.Single行爲和多線程安全

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)] 
public class UserService : IUserServiceContract 
{} 

我應該在這種情況下鎖定在服務中實現方法機制使用?

如果是,這是否正確實施?

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)] 
public class UserService : IUserServiceContract 
{ 
private readonly object LockObject = new object(); 

public Object1 GetObject1() 
{ 
    lock (LockObject) 
    { 
     using (var ob = new Object1) 
     { 
      return ob.Get(); 
     } 
    } 
} 

public Object2 GetObject2() 
{ 
    lock (LockObject) 
    { 
    using (var ob = new Object2) 
    { 
     return ob.Get(); 
    } 
    } 
} 
} 

回答

5

您應該同步對所有共享資源(即所有服務字段或屬性)的訪問。

但在這種情況下:

public Object2 GetObject2() 
{ 
    lock (LockObject) 
    { 
    using (var ob = new Object2) 
    { 
     return ob.Get(); 
    } 
    } 
} 

沒有,也沒有必要鎖定,因爲沒有共享的資源。對於每個調用(或消息)都有單獨的調用堆棧,因此在這種情況下,對於單獨的調用將創建單獨的Object2實例。

1

是的,我認爲你在這裏正確的軌道上,你的實現看起來是正確的。當使用ConcurrencyMode.Multiple時,由於多個線程將觸及該服務,因此您必須使您的代碼線程安全。

查看此Article (Summary Contains Sample Code),瞭解更多細節。

+0

但在這種情況下,沒有共享資源... –

+0

是的我同意,我的假設是這是虛擬代碼查看各種對象名稱。 – Tanner