Frage

Ich habe eine Server-Anwendung, die Informationen über ein Netzwerk empfängt und verarbeitet es. Der Server ist mit mehreren Threads und Mehrfachsteckdosen zum Zeitpunkt behandelt, und Threads ohne meine Kontrolle durch BeginInvoke und EndInvoke Stil Methoden erstellt, die durch entsprechende Callback-Funktionen verkettet sind.

Ich versuche, eine Form zu schaffen, zusätzlich zu der Haupt GUI, die ein ListBox Element von Elementen gefüllt zeigt die aktuell verbundenen Buchsen beschreiben. Also, was ich im Grunde zu tun versuche, ist ein Element in der List-Box hinzufügen mit seiner Funktion Add (), aus dem Thread der entsprechende Callback-Funktion läuft. Ich bin Zugriff auf meine Formulare steuert durch die Controls-Eigenschaft - I.E:

(ListBox)c.Controls["listBox1"].Items.Add();

Natürlich rufe ich nicht nur die Funktion, habe ich mehrere Möglichkeiten habe ich versucht habe hier und im Internet zu finden zwischen Threads zu kommunizieren, einschließlich MethodInvoker, eine delegate Verwendung in Kombination mit Invoke(), BeginInvoke() usw. Nichts scheint zu funktionieren, hat sie immer die gleiche Ausnahme mir wurde von einem anderen Thread als die zugegriffen meine Kontrolle zu sagen es erstellt wurde.

Alle Gedanken?

War es hilfreich?

Lösung

Sie haben Invoke anrufen (oder BeginInvoke) auf dem Steuerelement List-Box Sie für die Delegierten, um zugreifen auf dem Thread aufgerufen werden, die diese Kontrolle erstellt.

ListBox listBox = c.Controls["listBox1"] as ListBox;
if(listBox != null)
{
   listBox.Invoke(...);
}

Andere Tipps

ich immer etwas in dieser Richtung verwendet haben:

        c = <your control>
        if (c.InvokeRequired)
        {
            c.BeginInvoke((MethodInvoker)delegate
            {
                //do something with c
            });
        }
        else
        {
            //do something with c
        }

Ich schrieb auch eine Reihe von Helfer-Erweiterungsmethoden ... Hilfe.

using System;
using System.ComponentModel;
public static class CrossThreadHelper
{
    public static bool CrossThread<T,R>(this ISynchronizeInvoke value, Action<T, R> action, T sender, R e)
    {
        if (value.InvokeRequired)
        {
            value.BeginInvoke(action, new object[] { sender, e });
        }

        return value.InvokeRequired;
    }
}

wie folgt verwendet:

     private void OnServerMessageReceived(object sender, ClientStateArgs e)
    {
        if (this.CrossThread((se, ev) => OnServerMessageReceived(se, ev), sender, e)) return;
        this.statusTextBox.Text += string.Format("Message Received From: {0}\r\n", e.ClientState);
    }

BeginInvoke oder Invoke verwenden sollte gut funktionieren. Könnten Sie ein kurzes, aber vollständige Programm schreiben, das das Problem demonstriert? Sie sollten eine bis zu arbeiten in der Lage, die eigentlich keine serverseitige Sachen braucht -. Nur ein Bündel von Fäden haben, die „so tun, als“ eingehende Verbindungen empfangen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top