2012-01-25 3 views
1

предположат у меня есть размещаемая служба WCF в консольном приложении, как это:службы WCF и блокировки ключевого слово

public class MyService : IContract 
{ 
    public static readonly object _locker_ = new object(); 

    public static void DoSomething() 
    { 
    lock (_locker_) 
    { 
     //block 1 
     DoAnotherWork(); 
    } 
    } 

    void IContract.Foo1() 
    { 
    lock (_locker_) 
    { 
     //block 2 
     DoSomeWork(); 
    } 
    } 

    void IContract.Foo2() 
    { 
    DoSomething(); 
    } 
} 

делает это гарантирует, что только один клиент находится в блоке 1? или блок 2?

ответ

1

Статический объект блокировки предназначен для каждого приложения; поэтому «блок 1» и «блок 2» допускают только один вызывающий. В конечном счете, да. До тех пор, пока у вас есть только один appdomain, p

Обратите внимание, что блокировки возвращаются, поэтому поток с блокировкой может снова вызвать методы без блокировки (но не через WCF, только при обычном вызове метода C#).

+0

так что я могу просто выполнить некоторую синхронизацию между моими клиентами только со статической блокировкой в ​​моем сервисе? – HPT

+0

@ HPT, если ваша синхронизация означает «только одна», да. Но! Это звучит слишком грубо, если у вас много абонентов. Вы по существу будете обрабатывать все запросы отдельно; есть способы сделать это в WCF путем маркировки атрибутами. –

2

У вас есть только один замок, поэтому только один способ может получить блокировку в любой момент времени. Для параллельной работы вам потребуются отдельные блокировки для DoSomeWork и DoAnotherWork.

Обратите внимание, что при рассмотрении потоков вы должны учитывать InstanceContextMode of your WCF service - по умолчанию PerCall.

Смежные вопросы