Erstellen Sie einen MethodInvoker-Funktion
Also ich habe multi-threaded meine Anwendung. Ich lief in diese Fehlermeldung "Cross-thread operation not valid: Steuerung und Zugriff von einem anderen thread als dem thread der es erstellt wurde."
Mein thread war das aufrufen einer windows-forms-Steuerelement. So, dies zu umgehen, benutzte ich
Kontrolle.Invoke(new MethodInvoker(delegate { ControlsAction; }));
Ich versuche herauszufinden, eine Möglichkeit, ich könnte diese generische Methode, so kann ich die Wiederverwendung von code und die app eine Menge sauberer.
So zum Beispiel auf meiner ruft ich den folgenden Code mit einem rich-text-Feld.
rtbOutput.Invoke(new MethodInvoker(delegate {
rtbOutput.AppendText(fields[0].TrimStart().TrimEnd().ToString() + " Profile not
removed. Check Logs.\n"); }));
Anderen ist mit einer combo-box, wo ich einfach die Einstellung der text.
cmbEmailProfile.Invoke(new MethodInvoker(delegate { EmailProfileNameToSetForUsers =
cmbEmailProfile.Text; }));
Weiteres Beispiel ist wieder mit einem rich-text-box, wo ich bin, einfach löschen.
rtbOutput.Invoke(new MethodInvoker(delegate { rtbOutput.Clear(); }));
Wie würde ich erstellen Sie eine generische Funktion, die könnten das für mich tun, wo ich gerade übergeben müssen in der Steuerung mit der Aktion will ich es tun?
Dies ist, was wir gekommen sind so weit.
private void methodInvoker(Control sender, Action act)
{
sender.Invoke(new MethodInvoker(act));
}
also das problem ist so etwas wie appendtext, scheint es nicht zu mögen.
- verwenden Sie ein Action - <T> statt / mit den Delegierten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Etwas wie dies sollte den trick tun:
Und dann ist es einfach:
Mit Ihrem ursprünglichen label:
// Code to run on main thread here
ist. Ändern Sie sonst nichts. Es funktioniert.FormsExt
und Sie müssen sicherstellen, dass Sie fügen Sie eineusing
Erklärung auf den namespace setzen Sie die Klasse in.