2012-07-16 3 views
45

이것은 학문적 인 질문입니다 ...하지만 ConcurrentDictionary.TryAdd가 실패 할 수 있습니까? 그렇다면 어떤 경우에 왜 그렇습니까?ConcurrentDictionary.TryAdd가 실패 할 수 있습니까?

+0

이 질문은 꽤 애매합니다. MSDN [페이지] (http://msdn.microsoft.com/en-us/library/dd267291.aspx)에는 예외적 인 것과 다른 것의 두 가지 이유가 설명되어 있습니다. –

+9

예 및 MSDN 설명서의 명확성과 무결성으로 알려져 있습니다. –

+1

글쎄, 그것은 분명하고 다른 답변에 대한 완벽한 보인다. –

답변

69

이를 수 있음 여기 상태 (from msdn) 위치 :

  • 경우 ArgumentNullException은 - 키가 null 참조
  • OverflowException - 요소의 최대 수에 도달했을 때
  • 그것을 동일한 키를 가진 요소가 이미 존재하면 false을 반환합니다.

다시 말해서, 이것은 동시성과 관련이 없습니다. 당신은 같은 시간에 항목을 삽입하는 방법에 대한 두 개의 스레드를 걱정하면 다음과 같은 문제가 발생할 수 있습니다 : 키가

  • 한 삽입이 잘 작동하고 true를 돌려 다른 경우

    • 모두 삽입이 잘 작동, 다른 삽입 실패 (예외는 아님) false를 반환합니다. 이것은 두 개의 스레드가 동일한 키를 가진 항목을 삽입하려고 시도 할 때 기본적으로 하나의 스레드 만이 다른 느슨한 항목보다 우선 순위가 높을 때 발생합니다.
  • +4

    Ok ... 동시 액세스와 아무런 관련이 없습니다. 표준 사전과 동일한 검사를 수행합니다. –

    +1

    예, 내부적으로 CPU 회전을 사용하므로 여러 동시 연결이 가능합니다. – oleksii

    +0

    고마워. 나는 당신의 대답을 가장 건설적인 것으로 받아들이고 있습니다. 우리는 여기에서 다소 애매한 버그를 디버깅하고 있으며 가능한 소스를 한 줄씩 배제하고 있습니다. 내가 기여한 것을 토대로 TryAdd를 배제 할 수 있습니다. (추가 실패시 여분의 로깅을 추가 할지라도) –

    6

    물론 가능합니다. 키가 이미 존재하면 메서드는 false를 반환합니다.

    참조 : http://msdn.microsoft.com/en-us/library/dd267291.aspx

    반환 값 유형 : 선택 System.Boolean 실제 키/값 쌍을 성공적으로 ConcurrentDictionary에 추가 된 경우. 키가 이미있는 경우이 메서드는 false를 반환합니다.

    +0

    음 ... 그건 주어진 것입니다. 그게 실패 할 수있는 유일한 경우인가요? –

    +0

    @daveL - 예, 예외가 발생할 때 ... Oleksii의 답변을 참조하십시오. –

    +0

    도와 줘서 고마워. 내가 +1 했어. –

    2

    키가 사전에 이미 존재하면 실패합니다.

    메모리가 부족하여 값을 추가 할 수없는 경우 대신 예외가 발생합니다.

    관련 문제