2016-07-15 35 views
0

我有一个奇怪的行为,在我的一个ASP.net Web服务的基本方法之一。首先:这是自多年以来一直有生产力的代码,迄今为止还没有报道过任何问题。但在我的单元测试中,我认识到这个问题有两次,所以现在我很困惑,如果它只是在我的开发中,或者它是一个真正的问题。“ArgumentException:项目已被添加”哈希表

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

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(); 

而这种的MessageHandler用于在我所有定义在基类中的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服务端点。但是我的任何对象都不是静态的,那么这怎么会发生呢?
+0

您还必须显示消息类别。 – user3185569

+0

@ user3185569你为什么认为它对这个问题负责?这是一个简单的类,只有属性,里面没有逻辑。 – Max

回答

1

我明白你的意思,应该同步运行。然而,试试这个,看看它的工作原理:

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调用。

+0

这是个好主意,我会给它一个机会。 但是:我不应该更好地使用单独的锁对象而不是要修改的对象吗? – Max

+0

我想是的,但使用相同的对象简化了它的使用,并确保你不使用错误的:) –

相关问题