2016-12-02 4 views
-1

Ist die AddSafe-Methode wirklich Thread-sicher oder was mache ich falsch?Ist meine Sammlung sicher?

public static MyCollection myCol = new MyCollection(); 

class MyCollection: ObservableCollection<string> 
{ 
    public void AddSafe(string item) 
    { 
     lock(this) 
     { 
      this.Add(item); 
     } 
    } 
} 
+1

http://stackoverflow.com/questions/23108045/how-to-make-observablecollection-thread-safe check this! – TripleEEE

+0

vom Link überprüfen Sie die Antwort von Robert Fraser! – mybirthname

Antwort

0

Wie wäre es mit remove/acces, es geht nicht nur um hinzufügen? Aber auch das Lesen von Gegenständen sollte gesperrt werden.


Es gibt ein kleines Problem, das durch Design: Sie verwenden ein ObservableCollection, die meist von der GUI verwendet wird.

Ich rate Ihnen nicht die ObservableCollection<> in anderen Threads als die GUI-Thread verwenden. Die Steuerelemente, die den Ereignissen "zuhören", werden zusammenbrechen, wenn sie auf anderen Threads als dem GUI-Thread ausgelöst werden. Wenn Elemente in einer ObservableCollection geändert werden, sollte sie auf dem Dispatcher aufgerufen werden. Auf diese Weise ist Ihre Sammlung threadsafe. (wegen nicht Gewindes mit)

Pseudo

public class MyControl: UserControl 
{ 

    private void MyMethodCalledFromAnOtherThread() 
    { 
     this.Dispatcher.Invoke(new Action(
     { 
      // Change the collection... 
      myCol.Add("Hi there"); 
     }); 
    } 
+0

Ja, es geht nicht nur um hinzufügen, ich habe nur im Allgemeinen gefragt. Ich lese Daten Formular-Socket in separaten Thread, so kann ich dies nicht in GUI-Thread –

+0

Sie sollten nicht in der Observablecollection aus dem Socket-Thread schreiben. Verwenden Sie 'dispather.invoke', um den Sockerthread und den GUI-Thread zu synchronisieren. Oder noch besser. Verwenden Sie eine Warteschlange, um empfangene Nachrichten zu speichern, die vom Socket-Thread in die Warteschlange gestellt wurden, und verwenden Sie einen DispatcherTimer, um die Warteschlange zu verarbeiten. Auf diese Weise drückt der Socket-Thread den GUI-Thread nicht. –