Announcement

Collapse
No announcement yet.

Zugriff auf Objekte eines anderen Threads

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zugriff auf Objekte eines anderen Threads

    Hallo zusammen,

    ich habe einen FileSystemWatcher, der ein lokales Verzeichnis samt Unterverzeichnisse überwachen soll und sich melden soll, wenn, in meinem Fall, sich an einer der dort liegenden XML-Dateien was ändert. Der Inhalt dieser Dateien wird auf der UI als TreeView dargestellt und dieser soll angepasst werden, wenn sich die Datei verändert.
    Der FileSystemWatcher funktioniert dabei auch sehr gut, nur läuft dieser von sich aus schon in einem anderen Thread als die UI und hier kommt dann mein Problem.
    Wie kann ich jetzt auf die Objekte der UI zugreifen und so ein aktualisieren des TreeViews auslösen?
    Onkel Google hat viel über Dispatcher, Invoke, BeginInvoke usw. ausgespuckt, aber das hat alles irgendwie nicht funktioniert, bzw. ich weiß noch nicht mal so richtig, was ich da als Parameter so einem Invoke mitgeben muss, oder es ihm richtig mitgebe.

    [highlight=c#]
    void FSW_Changed(object sender, FileSystemEventArgs e)
    {
    if (e.Name.ToLower().EndsWith(".xml"))
    {
    // holt den Inhalt des XML und steckt ihn in den TreeView
    this.GetXMLValues(this.GetItemByTag(e.FullPath)); // im Tag jedes TreeViewItems ist der Dateipfad des XML hinterlegt.
    }
    }

    public TreeViewItem GetItemByTag(string tag, ItemCollection parentColl = null)
    {
    TreeViewItem returnItem = null;
    ItemCollection searchColl = treeViewAdv1.Items;
    if (parentColl != null) searchColl = parentColl;
    // Das zu aktualisierende TreeView-Element finden
    foreach (TreeViewItem item in searchColl)
    {
    if (item.Tag != null && item.Tag.ToString() == tag) returnItem = item; // hier kracht es wegen des threadübergreifenden Zugriffversuchs
    if (returnItem == null && item.HasItems) returnItem = this.GetItemByTag(tag, item.Items);
    }
    return returnItem;
    }
    [/highlight]

    Kann mir jemand sagen wie ich das richtig machen muss/kann?

    Danke
    Andi

  • #2
    Ich hab jetzt eine Lösung gefunden die zu funktionieren scheint.

    Dieses Beispiel funktioniert, auf mein Problem umgeschrieben, ganz gut, soweit ich das sehe:

    [highlight=c#]
    public delegate void DataReceived(int code);

    private void OnDataReceived(int code)
    {
    textBoxIn.Text += (char)(code);
    }

    private void serialPortIn_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
    DataReceived dateReceivedDelegate = new DataReceived(OnDataReceived);
    this.Invoke(dateReceivedDelegate, serialPortIn.ReadChar());
    }
    [/highlight]

    Comment


    • #3
      Der Delegat sollte überflüssig sein das entscheidende ist der Aufruf von Invoke.
      Da es sich scheinbar um ein Winforms Projekt handelt kannst du aber auch einfach das SynchronizingObject des FilesystemWatchers auf dein Form setzten dann werden die Events in den UI Thread synchronisiert.

      Comment


      • #4
        Ok danke Ralf,

        das hat geklappt

        Comment

        Working...
        X