0
假設我有一個WCF服務可以訪問多個客戶端之間共享的一些數據。這兩個設置有什麼區別:WCF:實例化和併發問題
1)實例化:單一,併發:多個,共享數據存儲在實例變量中。
2)Instancing:Per-Call,Concurrency:Multiple,其中共享數據存儲在static變量中。
有什麼實際區別?無論哪種方式,我將不得不確保共享數據是線程安全的,但我想知道一種特定方法是否有任何優勢。
假設我有一個WCF服務可以訪問多個客戶端之間共享的一些數據。這兩個設置有什麼區別:WCF:實例化和併發問題
1)實例化:單一,併發:多個,共享數據存儲在實例變量中。
2)Instancing:Per-Call,Concurrency:Multiple,其中共享數據存儲在static變量中。
有什麼實際區別?無論哪種方式,我將不得不確保共享數據是線程安全的,但我想知道一種特定方法是否有任何優勢。
從概念上講,沒有區別。正如你所說的,無論哪種方式,你都必須同步訪問共享數據。實際上,第二種選擇更好。從權威書籍WCF,Programming WCF Services通過Juval Lowy:
...每次呼叫的服務實際上是 WCF服務 首選實例的管理模式......建議您 避免在一般情況下 單身並想方設法分享 這個單身人士,而不是單身人士 這個實例本身。
我對我的項目使用選項#2。 WCF服務本身就是執行工作的類的靜態方法的簡單外觀。例如,
public class Logger
{
private static List<Logger> _loggers = new List<Logger>();
private static object _sync = new object();
public static void Start()
{
Logger logger = new Logger();
logger.Start();
lock (_sync) {
_loggers.Add(logger);
}
}
private Logger()
{
// construct the Logger object...
}
private void Start()
{
// start the logger here...
}
}
public class LoggingService : ILoggingService
{
public void StartLogger()
{
Logger.Start();
}
}
顯然,我忽略了許多細節,但是這顯示了總體思路。
很好的參考,但它仍然不清楚爲什麼選項2通常是一個更好的方法。有沒有一種情況下,方案1的靈活性較低,或效率不高? – Ben 2010-11-13 00:08:54
該書說選項2比交易選項1更適合交易處理。對我有意義,但由於它對我的項目沒有用處,所以我沒有探索這方面的內容。 – 2010-11-13 04:05:25