WCF: заставлять все вызовы ждать, когда вызывается один конкретный интерфейс - PullRequest
1 голос
/ 29 ноября 2010

У меня есть служба WCF с несколькими интерфейсами, которые только читают данные.Однако существует один интерфейс, который перезагружает данные из базы данных и повторно инициализирует некоторые словари.Пока работает этот интерфейс «Перезагрузка», я хочу, чтобы все другие вызовы были переведены в режим ожидания, поскольку они будут считывать данные неизвестного состояния (как я использую для каждого вызова)возможно в WCF?Или есть лучший способ обойти эту проблему?

Ответы [ 2 ]

1 голос
/ 29 ноября 2010

Полагаю, что если вы играете с ConcurrencyMode и устанавливаете его на сингл, вы можете добиться того, чего хотите.

Сказав это, я достиг того, чего вы хотите, имея флаг на моемСервисы.Если вы установите статический флаг, другие вызовы могут проверить этот флаг и делать то, что вы хотите, чтобы он делал

1 голос
/ 29 ноября 2010

Предложить вам:

  1. Изменить InstanceContextMode.PerCall на InstanceContextMode.Single
  2. Затем добавьте ConcurrencyMode = ConcurrencyMode.Multiple (позволит выполнить более 1 одновременно)
  3. В вашей реализации MyObject вручную разрешите параллелизм. Используйте простую lock или продвинутую механику, например ReaderWriterLockSlim .

Реализация с блокировкой выглядит следующим образом:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
class MyObject: IMyObject
{
    private readonly object lockObject = new object();
    public string Reload()
    {
        lock (lockObject)
        {
            // Reload stuff
        }
    }
    public string Read1()
    {
        lock (lockObject)
        {
            // Read1 stuff
        }
    }

    public string Read2()
    {
        lock (lockObject)
        {
            // Read2 stuff
        }
    }
}

Недостатки: он не позволяет одновременно вызывать Read1 и Read2. Если вам нужна эта функциональность, вместо блокировки используйте ReaderWriterLockSlim .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...