2017-11-22 1 views
-1

Ich habe ein Wörterbuch mit Nebenläufigkeitsproblemen, und ich bin angewiesen, keine Sperren zu verwenden, daher habe ich beschlossen, separate Kopien davon für jeden Thread zu erstellen. Da wir .Net 3.5 verwenden, verwende ich ThreadStatic Schlüsselwort. Mein Problem ist, dass einige der Threads auf das Wörterbuch zugreifen, ohne Daten einzugeben. Wie kann ich das auf einfache Weise lösen?Beheben von Nebenläufigkeitsproblemen ohne Sperre

Derzeit mein Code sieht wie folgt aus:

private static Dictionary<string, int> MyDict_; 
[ThreadStatic] 
public static Dictionary<string, int> myDict; 

public static Dictionary<string, int> MyDict 
{ 
     get 
     { 
      if (myDict == null) 
      { 
       if (MyDict_ != null) 
        myDict = new Dictionary<string, int>(MyDict_); 
       else 
        myDict = new Dictionary<string, int>(); 
      } 
      return myDict; 
     } 
     set 
     { 
      myDict = value; 
     } 
    } 

void Load(CustomData data) 
{ 
if(DictionaryPopulated) 
    { 
    LoadInto(myDict,data) 
    } 
else 
    { 
    LoadInto(MyDict_,data) 
    DictionaryPopulated=true; 
    } 
} 

Aber mir wurde gesagt, dies unnötig komplex ist. Was wäre ein besserer Weg, dies zu erreichen?

+0

Und Sie dürfen 'ConcurrentDictionary' nicht verwenden? –

+0

Nein ConcurrentDictionary erlaubt –

+0

Ich bin mir nicht sicher, ob ich den Anwendungsfall vollständig verstanden habe, aber wenn einer der Threads in das Wörterbuch schreiben kann, ist dies kein Problem, das Sie ohne Sperren lösen können. sichere Sammlungen, die * sehr * komplex sind) –

Antwort

1

@KevinGosse ist richtig - Ihr Anwendungsfall ist schwer zu verstehen. "Mein Problem ist, dass einige der Threads auf das Wörterbuch zugreifen, ohne Daten einzugeben." nicht sicher, was du hier meinst?

Aber von dem, was ich sammeln Sie suchen eine Implementierung, wo es eine Instanz eines Wörterbuchs für jeden Thread gibt? Wenn das richtig ist, dann ist dies eine vereinfachte Version des Codes Sie bereitgestellt:

public class TestDictionary 
{ 
    [ThreadStatic] 
    private static Dictionary<string, int> _myDic; 
    public static Dictionary<string, int> MyDic 
    { 
     get 
     { 
      if (_myDic == null) 
       _myDic = new Dictionary<string, int>(); 
      return _myDic; 
     } 
    } 
} 

Ich weiß, dass Sie .NET 3.5 verwenden, aber dennoch, wenn Sie Zugriff auf einen höheren .NET Framework erhalten können, dann können Sie das ausführen folgender test:

[TestMethod] 
    public void TestMethod1() 
    { 
     var task1 = Task.Run(() => 
     { 
      TestDictionary.MyDic.Add("test1", 1); 
      Assert.AreEqual(1, TestDictionary.MyDic.Count); 
     }); 

     var task2 = Task.Run(() => 
     { 
      TestDictionary.MyDic.Add("test2", 2); 
      Assert.AreEqual(1, TestDictionary.MyDic.Count); 
     }); 

     var task3 = Task.Run(() => 
     { 
      TestDictionary.MyDic.Add("test3", 3); 
      Assert.AreEqual(1, TestDictionary.MyDic.Count); 
     }); 

     var tasks = new[] 
     { 
      task1, 
      task2, 
      task3 
     }; 

     Task.WaitAll(tasks); 

     TestDictionary.MyDic.Add("test4", 4); 
     Assert.AreEqual(1, TestDictionary.MyDic.Count); 
    } 

Jeder Thread hat eine Instanz seines eigenen Wörterbuchs.