“参数异常:项目已被添加”为哈希表

本文关键字:添加 哈希表 项目 参数 异常 参数异常 | 更新日期: 2023-09-27 17:57:04

我在 ASP.net Web 服务的基本方法之一中有一个奇怪的行为。首先:这是多年来富有成效的代码,到目前为止还没有报告任何问题。但是在我的单元测试中,我两次认识到这个问题,所以我现在很困惑,如果它只是在我的开发中,还是一个真正的问题。

这是我的代码片段,其中错误

System.ArgumentException:已添加项目。字典中的键:"6" 添加的键:"6"

在调用_messages.Add时发生:

public Message Add(GatewayMessageTypes type, string strMessage, CultureInfo language)
{
    var message = new Message(type, strMessage, language);
    int intCount = _messages.Count + 1;
    if (_messages.ContainsKey(intCount))
    {
        _messages.Remove(intCount);
    }
    _messages.Add(intCount, message);
    return message;
}

_messages定义为:

public class MessageHandler
{
    private readonly Hashtable _messages = new Hashtable();

这个消息处理程序用于我在基类中定义的所有 Web 服务中

public abstract class ServiceBase
{
    public MessageHandler MessageHandler { get; protected set; }

这是堆栈跟踪:

   at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add)
   at System.Collections.Hashtable.Add(Object key, Object value)
   at GISGatewayCore.MessageHandler.Add(GatewayMessageTypes strType, String strMessage, CultureInfo language) in GISGateway'GISGatewayCore'MessageHandler.cs:line 69
   at GISGatewayCore.MessageHandler.AddAndLog(GatewayMessageTypes type, String strMessage, CultureInfo language) in GISGateway'GISGatewayCore'MessageHandler.cs:line 81
   at GISGateway.Services.GetClosestFacilityServices.<>c__DisplayClass4.<GetClosestFacilities>b__1(Object index) in GISGateway'GISGateway.Services'GetClosestFacilityServices.cs:line 592
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart(Object obj)

没错,集合中已经有 6 个条目,数字 6 看起来与应该添加的新消息完全相同。那么问题出在哪里呢?

  1. 删除失败了吗?是执行速度慢吗?但是代码是同步的,应该不会有任何问题吧?
  2. 具有相同值的两个不同条目?我很确定这可以被排除在外
  3. 是否有两个并行进程使用相同的代码?我的单元测试共同使用此部分,我的两个测试使用相同的 Web 服务终结点。但是我的所有对象都不是静态的,所以怎么会发生这种情况呢?

“参数异常:项目已被添加”为哈希表

我理解你的意思,它应该同步运行。但是,请尝试此操作,看看它是否有效:

public Message Add(GatewayMessageTypes type, string strMessage, CultureInfo language)
{
  lock(_messages)
  {
    var message = new Message(type, strMessage, language);
    int intCount = _messages.Count + 1;
    if (_messages.ContainsKey(intCount))
    {
        _messages.Remove(intCount);
    }
    _messages.Add(intCount, message);
    return message;
  }
}

我可能会在同一个"会话"上从两个来源调用,就像 ajax 调用控制器一样。