"ArgumentException: Item has already been added" 用于哈希表
"ArgumentException: Item has already been added" for hashtable
我在 ASP.net Web 服务的一个基本方法中有一个奇怪的行为。
首先:这是多年来一直有效的代码,到目前为止还没有报告任何问题。但是在我的单元测试中我发现了两次这个问题,所以我现在很困惑,如果它只是在我的开发中或者它是否是一个真正的问题。
这是我的代码片段,其中错误
System.ArgumentException: Item has already been added. Key in dictionary: '6' Key being added: '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 用于我在基础 class
中定义的所有 Web 服务
public abstract class ServiceBase
{
public MessageHandler MessageHandler { get; protected set; }
这是 StackTrace:
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)
没错,collection里已经有6个条目了,第6个跟应该添加的新消息一模一样。
那么问题是什么?
- 删除失败了吗?执行速度会变慢吗?但是代码是同步的,应该不会有什么问题吧?
- 具有相同值的两个不同条目?我很确定这可以排除
- 是否有两个并行进程使用相同的代码?我的单元测试共同使用这部分,我的两个测试使用相同的 Web 服务端点。但是我的 objects 中的 none 是静态的,所以怎么会这样?
我理解你的意思,它应该 运行同步。但是,试试这个,看看它是否有效:
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;
}
}
我可能在同一个 "session" 上被两个来源调用,就像 ajax 在控制器上调用一样。
我在 ASP.net Web 服务的一个基本方法中有一个奇怪的行为。 首先:这是多年来一直有效的代码,到目前为止还没有报告任何问题。但是在我的单元测试中我发现了两次这个问题,所以我现在很困惑,如果它只是在我的开发中或者它是否是一个真正的问题。
这是我的代码片段,其中错误
System.ArgumentException: Item has already been added. Key in dictionary: '6' Key being added: '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 用于我在基础 class
中定义的所有 Web 服务public abstract class ServiceBase
{
public MessageHandler MessageHandler { get; protected set; }
这是 StackTrace:
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)
没错,collection里已经有6个条目了,第6个跟应该添加的新消息一模一样。 那么问题是什么?
- 删除失败了吗?执行速度会变慢吗?但是代码是同步的,应该不会有什么问题吧?
- 具有相同值的两个不同条目?我很确定这可以排除
- 是否有两个并行进程使用相同的代码?我的单元测试共同使用这部分,我的两个测试使用相同的 Web 服务端点。但是我的 objects 中的 none 是静态的,所以怎么会这样?
我理解你的意思,它应该 运行同步。但是,试试这个,看看它是否有效:
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;
}
}
我可能在同一个 "session" 上被两个来源调用,就像 ajax 在控制器上调用一样。