2014-02-19 25 views
1

有什麼乾淨的方式讓WCF調用根據請求參數應用1的最大並行度?WCF調用中基於請求參數的並行性?

假設下面的代碼:

public void MyWcfOperation(int entityId, other arguments) 
{ 
     //do stuff with entity with id = entityId 
} 

我要處理的最大的基於ENTITYID這裏1個parallell電話。 我知道我可以爲WCF設置併發選項,但這是併發或單線程的。但是當我需要每個entityId的單個調用時,將它設置爲整個操作的單個調用似乎有點過於激烈。

我假設我必須手動處理這個問題,但是我最好在這裏不要涉及一個演員模型庫?

回答

1

首先,考慮您是否真的需要根據ID進行同步。您是否預見了擴大問題?與往常一樣,在尋求可能過早的優化之前,測試和基準測試是您的最佳選擇。

也就是說,如果實體ID的數量不是很大,你可以使用這個簡單的解決方案:

[ServiceBehavior(
    InstanceContextMode = InstanceContextMode.Single, // required to hold the dictionary through calls 
    ConcurrencyMode = ConcurrencyMode.Multiple] // let WCF run all the calls concurrently 
class Service 
{ 
    private readonly ConcurrentDictionary<int, object> _locks = new ConcurrentDictionary<int, object>(); 

    public void MyWcfOperation(int entityId, other arguments) 
    { 
    lock (_locks.GetOrAdd(entityId, i => new Object()) 
    { 
     // do stuff with entity with id = entityId 
    } 
    } 
} 

這不涉及清理,所以如果你有很多的實體,該詞典成長爲包含每個鎖對象。

+0

太棒了,這會爲我的用例做訣竅 –

相關問題