我是WCF中状态/并发管理的初学者。假设我有一个类似下面的服务类:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service1 : IService1
{
private int _myCounter;
private MyType _myType;
private static MyType _myTypeStatic;
private static Dictionary<string,string> _d = new Dictionary<string,string>();
public void Method1()
{
// logic to set _myType
// logic to set _myCounter
// logic to set _myTypeStatic
// logic to set _d
}
public void Method2()
{
// logic to save _myType, set in Method1() to db
// logic to save _myCounter, set in Method1() to db
// logic to save _myTypeStatic, set in Method1() to db
// logic to save _d, set in Method1() to db
}
}
如果2个客户端连接同时使用此服务,它们将在2个不同的线程上运行。在这种情况下,2个全局类级别变量的状态将如何变化,因为只有服务的实例?它如何适用于静态变量和类型?这两个线程是否有可能有两个不同的变量数据副本,但仍然可以使用一个服务实例?
答案 0 :(得分:0)
也许定义一个类或结构来存储变量集,然后简单地在方法中传递它?
public class Storage
{
public Storage(int myCounter, MyType myType)
{
_myCounter = myCounter;
_myType = myType;
}
public int _myCounter;
public MyType _myType;
}
...
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service1 : IService1
{
public void Method1(Storage st)
{
// logic to set _myType
// logic to set _myCounter
}
public void Method2(Storage st)
{
// logic to save _myType, set in Method1() to db
// logic to save _myCounter, set in Method1() to db
}
}
这样,Service1可以处理它没有直接连接到的数据 - 然而每个呼叫者都必须“关注”它的数据,例如:保留某处的存储空间。
答案 1 :(得分:0)
首先,所有变量都应该是关键部分的线程安全。即使您未设置InstanceContextMode.Single,静态变量也将在所有实例之间共享。将为进入该实例的所有线程共享类变量。 ConcurrencyMode.Multiple指示可以输入多个线程。此外,即使您应用关键部分,您使用的逻辑也将无效。如果然后线程设置数据并返回释放临界区。在尝试再次调用以保存数据之前,另一个线程可以覆盖数据。这意味着您需要在一次操作中存储数据。或者您希望将数据设置一段时间然后存储它,然后将要将数据存储在哈希表中。与方法1一样,使用关键部分设置数据并放置一个唯一的密钥来设置客户端ID等数据的密钥,如果他不知道,则将密钥返回给客户端。然后在方法2中,客户端将传递密钥。使用密钥访问哈希表并使用客户端检索数据并保存。