2012-06-22 7 views
1

여기에 사전에 값을 업데이트하는 방법의 예를 보여주는 코드 조각이 있습니다. 이것이 스레드 안전하다고 확신하지 않기 때문에 이것이 최선의 방법이라고 생각하지 않습니다.사전을 사용하는 올바른 방법

편집 : 그냥 POC 코드입니다. 키를 배열에 복사 한 다음 사전에 내용을 저장하는 것입니다. 내 고용주 코드는 여기에 게시 할 수 없으므로 지적 해보기를했습니다.

키 배열을 가져 오면 코드의 일부 다른 부분에서 사전 참조를 사용하고 일부 키가 추가 될 수 있으며 이러한 함수는 일부 키를 복사했기 때문에 모든 키를 업데이트하지 않습니다 시간. 내가 서브 클래 싱하거나 어쩌면 사전을 감싸고 잠금 장치로 작업을 수행해야합니까? 아니면 더 간단한 방법이 있습니까?

올바른 방법으로 값을 업데이트해야합니까? 당신이 .NET 4에서 스레드 안전 사전을 원하는 경우에

static void Main(string[] args) 
    { 
    Dictionary<string, int> dic = new Dictionary<string, int>(); 

    dic.Add("Kej1",0); 
    dic.Add("Kej2",1); 
    dic.Add("Kej3", 3); 
    dic.Add("Kej4", 3); 

    String[] arr = new string[dic.Count] ; 
    dic.Keys.CopyTo(arr,0); 

    foreach (var va in arr) 
    { 
     Console.WriteLine(dic[va] + " " + va); 
     dic[va] = 10; 
     Console.WriteLine(dic[va] + " " + va); 
    } 
    Console.ReadKey(); 
    } 
+4

이 예제가 보여줄 것으로 예상되는 정보가 없습니다. 여러 개의 스레드를 언급했지만 예제에는 아무 것도 없습니다. 귀하의 질문에 단어를 다시 써보십시오. – Jon

+0

이것은 콘솔 응용 프로그램처럼 보입니다. 코드에 다중 스레드가 없습니다. – Aphelion

+0

@ 존 설명을 업데이트했습니다. 그냥 POC 코드 일뿐입니다. 일부 상상력은 감상적 일 것입니다. 여기서는 "내 코드가 아닙니다"라고 게시 할 수 없습니다. – Mateusz

답변

0

현재 구현은 정상적으로 처리됩니다. 귀하의

Dictionary<string, int> dic = new Dictionary<string, int>(); 

은 로컬 변수이며 메인 스레드 만 참조합니다. 스레드 안전성에 대해 걱정할 필요가 없습니다.

당신이 정말이 스레드 안전 확인하려면, 당신은 사전 이런 식으로 잠글 수 있습니다 :

static void Main(string[] args) 
{ 
    Dictionary<string, int> dic = new Dictionary<string, int>(); 

    lock(dic) 
    { 
    dic.Add("Kej1",0); 
    dic.Add("Kej2",1); 
    dic.Add("Kej3", 3); 
    dic.Add("Kej4", 3); 

    String[] arr = new string[dic.Count] ; 
    dic.Keys.CopyTo(arr,0); 

    foreach (var va in arr) 
    { 
    Console.WriteLine(dic[va] + " " + va); 
    dic[va] = 10; 
    Console.WriteLine(dic[va] + " " + va); 
    } 
    } 
    Console.ReadKey(); 
} 
+0

그것이 내 첫 번째 생각 이었지만 가능한 최선의 방법으로하고 싶었습니다. – Mateusz

3

이후 당신은 ConcurrentDictionary를 사용할 수 있습니다.

+0

네, 할 수 있습니다. 그러나 이것은 예기치 않은 * 동작을합니다 (예를 들어 성공하지 못할 수도 있습니다). - 대부분의 경우'lock (dict) {...} '이있는 일반 사전은 작업을 잘 수행합니다. – Carsten

+0

위의 예와 같이 사전의 값을 업데이트 할 수 있습니까? 열거 형이 깨져 배열로 키를 복사하지 않고 값을 업데이트 할 수 없습니까? 동시 사전으로 일부를 테스트 해 보겠습니다. – Mateusz

0

당신은 당신이 실제로 다중 스레드를 사용하면 스레드 안전에 대해 걱정할 필요가 있습니다. 대부분의 시간 동안 당신은 그것을 모르게 할 수 없습니다. 그러니 걱정하지 마시고 원하는 방식으로 사전에 액세스하십시오.

"비동기"또는 "시작"이라는 단어가있는 것이 있으면 다시 고려해야 할 수도 있습니다.

+0

질문이 업데이트되었습니다. POC 코드 일 뿐이므로 여기에 프로덕션 코드를 게시 할 수 없습니다. – Mateusz

관련 문제