可以在WCF中安全地使用静态方法/类,因为WCF为每个用户创建了一个新线程,所以如果我有一个静态变量
public static int = 5
如果两个客户试图同时更改它,其中一个客户是否可以为另一个客户更改?
感谢...
答案 0 :(得分: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;
}
}
}
这是线程安全的,并且只要WCF的服务主机使进程保持活动,就会为每个线程和每个实例共享。
在IIS或任何此类流程模型中,如果流程被回收,您将丢失最后一个静态值。
您应该使用某种服务器/应用程序级别存储。例如HttpContext.Current.Server(在ASP.NET的情况下)。
答案 1 :(得分:4)
这里会有竞争条件。
静态字段将在所有服务实例中共享。如果两个实例“同时”访问它,您可能会得到不可预测的结果。
例如,如果两个线程将运行没有同步的代码,则可能会出现非确定性结果:
void Foo()
{
filed++;
Bar(field);
}
可以使用lock
来解决,例如:
void Foo()
{
lock(fieldLock)
{
filed++;
Bar(field);
}
}
答案 2 :(得分:0)
我假设您在询问两个客户端是否调用了更改服务器上静态字段的服务方法,这是否有效?我不确定你要完成什么,但是如果你想分享你需要做一些工作来使线程安全(锁定)。