wcf singleton服务多线程

时间:2015-07-03 04:30:00

标签: c# multithreading wcf

我有一个自托管的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;
        }
    }  
}

3 个答案:

答案 0 :(得分:0)

如果一个客户端添加而另一个客户端删除,如果您不处理并发,则可能会出现问题或状态不一致。

所以是的,我建议在共享信息/列表上使用锁定或同步机制

答案 1 :(得分:0)

你做得对吗?是的,但是这种类型的代码很难测试。如果你犯了错误,也很难调试。

更好的解决方案是使用为您执行此操作的类:ConcurrentQueue

答案 2 :(得分:0)

你这样做对吗? NO!

你做错了什么?重新发明轮子。

看起来你正试图重新发明MessageQueue模式。显而易见的解决方案是使用Message Queue软件包。

请看以下其中一项

  • MSMQ
  • 的RabbitMQ
  • 的Websphere
  • RavenMQ