【问题标题】:wcf singleton service multithreadedwcf 单例服务多线程
【发布时间】:2015-07-03 04:30:00
【问题描述】:

我有一个自托管的 wcf 单例服务。有两个客户在使用它。服务有一个 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;
        }
    }  
}

【问题讨论】:

  • 当您说增强性能时,您能说明您的意思吗?什么是慢的,你是如何衡量它的?
  • @marc_s ConcurrencyMode = ConcurrencyMode.Multiple 不允许同时使用多个线程吗?
  • @MauricioGracia 如果不需要锁定并且我正在使用它,它会使这个速度变慢(每秒处理的请求数)。不是吗?所以一些技术可以让它处理更多的请求。

标签: c# multithreading wcf


【解决方案1】:

如果一个客户端添加而另一个客户端删除,并且如果您不处理并发,您可能会遇到麻烦或状态不一致。

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

【讨论】:

【解决方案2】:

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

更好的解决方案是使用一个为你做这件事的类:ConcurrentQueue

【讨论】:

    【解决方案3】:

    你做对了吗?不!

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

    您似乎正在尝试重新发明MessageQueue 模式。显而易见的解决方案是使用 Message Queue 软件包。

    请查看以下内容之一

    • MSMQ
    • RabbitMQ
    • Websphere
    • RavenMQ

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      相关资源
      最近更新 更多