2016-07-15 11 views
0

ASP.net 웹 서비스의 기본 메서드 중 하나에서 이상한 동작이 발생했습니다. 우선 : 이것은 수년 이래로 생산적인 코드이며 지금까지 문제가보고 된 적이 없습니다. 그러나 단원 테스트에서이 문제를 두 번 인식 했으므로 현재 개발 단계에 있거나 실제 문제인지 혼란 스럽습니다. 항목 이미 추가되었습니다"ArgumentException : 이미 항목이 추가되었습니다"해시 테이블

다음은 오류

System.ArgumentException 내 코드입니다. 사전의 키 : '6'키 인 추가 :

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는 다음과 같이 정의된다 : '6'

_messages.Add가 호출 될 때 발생

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

그리고이에 messageHandler 사용됩니다 기본 클래스에 정의 된 모든 웹 서비스에서

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. 동일한 코드를 사용하는 두 개의 병렬 프로세스가 있습니까? 내 단위 테스트는이 부분을 공통으로 사용하고, 두 가지 테스트는 동일한 웹 서비스 끝점을 사용합니다. 하지만 내 물건 중 어느 것도 고정적이지 않으므로 어떻게 될 수 있습니까?
+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; 
    } 
} 

나는 같은 "세션"에 두 소스에서 호출되는 수, 컨트롤러에 아약스 호출처럼.

+0

그건 좋은 생각이야. 나는 기회를 줄 것이다. 하지만 수정해야 할 개체 대신 별도의 잠금 개체를 사용하지 않아야합니까? – Max

+0

나는 네가 그렇다고 생각하지만 동일한 객체를 사용하면 그 사용이 단순 해지고 틀린 것을 사용하지 않게됩니다 :) –