可以安全地在WCF原因在於WCF爲每個用戶創建一個新的線程實際上使用靜態方法/類,所以如果我將有一個靜態變量靜態方法/字段和WCF
public static int = 5
,如果兩個客戶會嘗試同時更改它,其中一個客戶是否可以爲另一個客戶更改?
謝謝...
可以安全地在WCF原因在於WCF爲每個用戶創建一個新的線程實際上使用靜態方法/類,所以如果我將有一個靜態變量靜態方法/字段和WCF
public static int = 5
,如果兩個客戶會嘗試同時更改它,其中一個客戶是否可以爲另一個客戶更改?
謝謝...
那麼任何人都可以修改靜態字段,他們將看到最新的值取決於線程和處理器調度。但是爲了安全實現,你應該定義一個靜態對象並將其用於鎖定並通過靜態屬性提供對變量的訪問。
private static object lockObject = new object();
private static int _MyValue = 0;
public static int MyStaticValue{
get{
int v = 0;
lock(lockObject){
v = _MyValue;
}
return v;
}
set{
lock(lockObject){
_MyValue = value;
}
}
}
這是線程安全的,以及爲每個線程和每個實例只要WCF服務主機保持過程活着共享。
在IIS或任何此類過程模型中,如果過程被回收,您將丟失上一個靜態值。
您應該使用某種服務器/應用程序級存儲。例如HttpContext.Current.Server(在ASP.NET的情況下)。
這裏會有一個競賽條件。
靜態字段將在所有服務實例中共享。如果兩個實例「同時」訪問它,則可能會得到不可預知的結果。
例如,如果兩個線程,不進行同步運行代碼的非確定性結果可能出現:
void Foo()
{
filed++;
Bar(field);
}
它可以通過lock
例如解決:
void Foo()
{
lock(fieldLock)
{
filed++;
Bar(field);
}
}
我想你詢問兩個客戶是否調用服務方法來更改服務器上的靜態字段,這是否可行?我不確定你想要完成什麼,但是如果你想分享你需要做的一些工作以使它線程安全(鎖定)的價值。