OK. Я не уверен, что знал, что ConcurrencyMode
игнорируется при использовании инстансинга PerCall
, но, глядя на свой собственный проект, я использую инстансинг PerCall
и не указываю никакого значения для ConcurrencyMode
. Так что, очевидно, я знал это однажды и просто не смог документировать это в своем коде. Теперь это исправлено.
Мой проект работает так же, как вы описали свой, и я использую InstanceContextMode.PerCall
, как я уже упоминал. Вот что это значит.
- Client1 =>
MyAppWcfInst.DoSomething( "<customer id=A/>" );
- Client2 =>
MyAppWcfInst.DoSomething( "<customer id=B/>" );
- Client3 =>
MyAppWcfInst.DoSomething( "<customer id=B/>" );
Все три клиента будут взаимодействовать с вашей службой WCF одновременно, но каждый из них будет иметь свой собственный экземпляр и работать в отдельном потоке. Таким образом, хотя каждый вызов каждого клиента является однопоточным, они могут быть активными одновременно. Это означает, что список объектов Customer может быть доступен нескольким клиентам одновременно.
Client1 и Client2 могут работать параллельно, поскольку они имеют дело с различными объектами Customer, но Client3 должен дождаться завершения работы Client2, прежде чем он сможет «что-то сделать» с CustomerB. Все это означает, что вам нужно синхронизировать доступ внутри каждого объекта Customer. Другими словами, логика внутри метода Customer.DoSomething()
должна иметь блокировку синхронизации для предотвращения одновременной работы нескольких клиентов с клиентом.
class Customer
{
private object _sync = new object();
public string DoSomething( string xml )
{
lock (_sync)
{
// put your logic here...
}
}
}
Так работает моя служба WCF. Надеюсь, это поможет.