2017-02-22 4 views
-1

Это мой код:Как добавить ключевые значения пары параллельно в словарь в C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

namespace ConsoleApplication2 
{ 
    public class c_Thread 
    { 
     public bool ThreadOngoing; 

     public c_Thread() 
     { 
      ThreadOngoing = false; 
     } 

     public void CallToChildThread(string key, ref List<int> nums, 
       ref Dictionary<string, List<int>> container) 
     { 
      container.Add(key, nums); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      c_Thread cc = new c_Thread(); 

      Dictionary<string, List<int>> container1 = new Dictionary<string, List<int>>(); 

      List<int> aList = new List<int>(); 
      List<int> bList = new List<int>(); 

      string printLine; 

      aList.Add(2); 
      aList.Add(4); 
      aList.Add(2); 
      bList.Add(1); 
      bList.Add(3); 
      bList.Add(1); 

      Thread myNewThread1 = new Thread(() => 
       cc.CallToChildThread("param1", ref aList, ref container1)); 
      myNewThread1.Start(); 

      Thread myNewThread2 = new Thread(() => 
       cc.CallToChildThread("param2", ref bList, ref container1)); 
      myNewThread2.Start(); 

      while (myNewThread1.ThreadState == ThreadState.Running && 
        myNewThread2.ThreadState == ThreadState.Running) 
      { } 

      foreach (string key in container1.Keys) 
      { 
       printLine = key + ": "; 

       foreach(int val in container1[key]) 
         printLine += val + " "; 

       Console.WriteLine(printLine); 
      } 

      Console.ReadKey(); 
     } 
    } 
} 

Я пытаюсь добавить элементы параллельно в словаре, однако, следующее распечатывается:

В идеале я хочу обработать файл txt с несколькими столбцами, и я хочу ввести все в словарь, однако это занимает много времени.

param1: 2 4 2 

второй не распечатан, как я могу исправить это?

+0

«Словарь» не является потокобезопасным. – SLaks

+0

Используйте 'Thread.Join()'. – SLaks

+0

Ваш 'ref' абсолютно бесполезен. – SLaks

ответ

1

Проблема заключается в том, что словарь не является потокобезопасным. Вы хотите использовать ConcurrentDictionary.

public class c_Thread 
    { 
     public bool ThreadOngoing; 

     public c_Thread() 
     { 
      ThreadOngoing = false; 
     } 

     public void CallToChildThread(string key, ref List<int> nums, ConcurrentDictionary<string, List<int>> container) 
     { 
      container.TryAdd(key, nums); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var cc = new c_Thread(); 
      var container1 = new ConcurrentDictionary<string, List<int>>(); 
      var aList = new List<int>(); 
      var bList = new List<int>(); 
      string printLine; 
      aList.Add(2); 
      aList.Add(4); 
      aList.Add(2); 
      bList.Add(1); 
      bList.Add(3); 
      bList.Add(1); 
      var myNewThread1 = new Thread(() => cc.CallToChildThread("param1", ref aList, container1)); 
      myNewThread1.Start(); 
      var myNewThread2 = new Thread(() => cc.CallToChildThread("param2", ref bList, container1)); 
      myNewThread2.Start(); 
      while (myNewThread1.ThreadState == ThreadState.Running && myNewThread2.ThreadState == ThreadState.Running) { } 

      foreach (var key in container1.Keys) 
      { 
       printLine = key + ": "; 
       foreach (var val in container1[key]) printLine += val + " "; 
       Console.WriteLine(printLine); 
      } 
      Console.ReadKey(); 
     } 
    } 
Смежные вопросы