wcf并发模式=多个

时间:2012-10-26 08:16:14

标签: wcf session concurrency

我是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个全局类级别变量的状态将如何变化,因为只有服务的实例?它如何适用于静态变量和类型?这两个线程是否有可能有两个不同的变量数据副本,但仍然可以使用一个服务实例?

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中,客户端将传递密钥。使用密钥访问哈希表并使用客户端检索数据并保存。