2010-11-12 62 views
0

假設我有一個WCF服務可以訪問多個客戶端之間共享的一些數據。這兩個設置有什麼區別:WCF:實例化和併發問題

1)實例化:單一,併發:多個,共享數據存儲在實例變量中。

2)Instancing:Per-Call,Concurrency:Multiple,其中共享數據存儲在static變量中。

有什麼實際區別?無論哪種方式,我將不得不確保共享數據是線程安全的,但我想知道一種特定方法是否有任何優勢。

回答

1

從概念上講,沒有區別。正如你所說的,無論哪種方式,你都必須同步訪問共享數據。實際上,第二種選擇更好。從權威書籍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(); 
    } 
} 

顯然,我忽略了許多細節,但是這顯示了總體思路。

+0

很好的參考,但它仍然不清楚爲什麼選項2通常是一個更好的方法。有沒有一種情況下,方案1的靈活性較低,或效率不高? – Ben 2010-11-13 00:08:54

+0

該書說選項2比交易選項1更適合交易處理。對我有意義,但由於它對我的項目沒有用處,所以我沒有探索這方面的內容。 – 2010-11-13 04:05:25