wcf单例服务多线程
wcf singleton service multithreaded
我有一个自托管的 wcf 单例服务。有两个客户在消费它。 Service 有一个 List 类型的实例变量。共有三种方法。一个添加,一个删除,最后检查列表是否为空。 Client1 仅使用 add 方法。 Client2 使用 remove 和 isEmpty 方法。我想知道在这种情况下这些方法是否需要锁定?有没有更好的方法来解决这个问题以提高性能?
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service : IService
{
// will it be better to make it static ?
List<Parameter> _fileList = new List<Parameter>();
// Is this required ?
readonly object _lock = new object();
public bool FileEnQueue(Parameter parameter)
{
lock (_lock)
{
_fileList.Add(parameter);
}
return true;
}
public Parameter FileDeQueue()
{
lock (_lock)
{
Parameter parameter = new Parameter();
if (_fileList.Count > 0)
{
parameter = _fileList.ElementAt(0);
_fileList.Remove(parameter);
}
return parameter;
}
}
public bool IsQueueEmpty()
{
lock (_lock)
{
if (_fileList.Count == 0)
return true;
else
return false;
}
}
}
好吧,如果一个客户端添加而另一个客户端删除,并且如果您不处理并发,您可能会遇到麻烦或状态不一致。
所以是的,我建议在共享 info/list
上使用锁定或同步机制
你做对了吗?是的,但是这种类型的代码很难测试。出错也很难调试。
更好的解决方案是使用 class 为您完成:ConcurrentQueue
你做对了吗?不!
你做错了什么?重新发明轮子。
看来您正在尝试重新发明 MessageQueue
模式。显而易见的解决方案是使用 Message Queue 软件包。
请查看以下内容之一
- MSMQ
- RabbitMQ
- Websphere
- RavenMQ
我有一个自托管的 wcf 单例服务。有两个客户在消费它。 Service 有一个 List 类型的实例变量。共有三种方法。一个添加,一个删除,最后检查列表是否为空。 Client1 仅使用 add 方法。 Client2 使用 remove 和 isEmpty 方法。我想知道在这种情况下这些方法是否需要锁定?有没有更好的方法来解决这个问题以提高性能?
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service : IService
{
// will it be better to make it static ?
List<Parameter> _fileList = new List<Parameter>();
// Is this required ?
readonly object _lock = new object();
public bool FileEnQueue(Parameter parameter)
{
lock (_lock)
{
_fileList.Add(parameter);
}
return true;
}
public Parameter FileDeQueue()
{
lock (_lock)
{
Parameter parameter = new Parameter();
if (_fileList.Count > 0)
{
parameter = _fileList.ElementAt(0);
_fileList.Remove(parameter);
}
return parameter;
}
}
public bool IsQueueEmpty()
{
lock (_lock)
{
if (_fileList.Count == 0)
return true;
else
return false;
}
}
}
好吧,如果一个客户端添加而另一个客户端删除,并且如果您不处理并发,您可能会遇到麻烦或状态不一致。
所以是的,我建议在共享 info/list
上使用锁定或同步机制你做对了吗?是的,但是这种类型的代码很难测试。出错也很难调试。
更好的解决方案是使用 class 为您完成:ConcurrentQueue
你做对了吗?不!
你做错了什么?重新发明轮子。
看来您正在尝试重新发明 MessageQueue
模式。显而易见的解决方案是使用 Message Queue 软件包。
请查看以下内容之一
- MSMQ
- RabbitMQ
- Websphere
- RavenMQ