статические методы / поля и WCF - PullRequest
3 голосов
/ 30 августа 2010

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

public static int = 5

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

спасибо ...

Ответы [ 3 ]

5 голосов
/ 30 августа 2010

Ну, любой может изменить статическое поле, и он увидит последнее установленное значение в зависимости от планирования потока и процессора. Однако для безопасной реализации вы должны определить еще один статический объект и использовать его для блокировки и предоставить свой доступ к переменной через статическое свойство.

private static object lockObject = new object();
private static int _MyValue = 0;
public static int MyStaticValue{
   get{
      int v = 0;
      lock(lockObject){
         v = _MyValue;
      }
      return v;
   }
   set{
      lock(lockObject){
         _MyValue = value;
      }
   }
}

Это поточно-ориентированный, а также общий для всех потоков и каждого экземпляра, пока Service Host WCF поддерживает процесс живым.

В IIS или любой такой модели процесса, если процесс будет переработан, вы потеряете последнее статическое значение.

Вы должны использовать какое-то хранилище уровня сервера / приложения. например HttpContext.Current.Server (в случае ASP.NET).

4 голосов
/ 30 августа 2010

Здесь будет условие гонки.

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

Например, если два потока будут выполнять код без синхронизации, может появиться недетерминированный результат:

void Foo()
{
    filed++;
    Bar(field);
}

Это можно решить, используя lock, например:

void Foo()
{
    lock(fieldLock)
    {
         filed++;
         Bar(field);
    } 
}
0 голосов
/ 30 августа 2010

Я полагаю, вы спрашиваете, если два клиента вызывают метод службы, который изменяет статическое поле на сервере, это будет работать? Я не уверен, что вы пытаетесь достичь, но если вы хотите поделиться значением, вам нужно проделать определенную работу, чтобы сделать его безопасным для потоков (блокировка).

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