2010-08-30 2 views
3

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

public static int = 5 

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

благодаря ...

ответ

5

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

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; 
     } 
    } 
} 

Это поточно, а также общие для каждых потоков и в каждом случае до тех пор, как узел службы ФОС сохраняет процесс живого.

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

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

4

Там будет состояние гонки здесь.

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

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

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

может быть решена с помощью lock, например:

void Foo() 
{ 
    lock(fieldLock) 
    { 
     filed++; 
     Bar(field); 
    } 
} 
0

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

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