Beste Methode, um Cross-Threaded Code aufzurufen?
Ich weiß, dass diese Frage gestellt wurde, bevor, aber ich bin auf der Suche nach einem Weg:
- optimierten Erstellung von sicheren cross-Thread-code.
- Wiederverwendung dieser code in jeder situation (keine Windows Forms-Referenzen).
Hier ist, was ich habe, so weit, aber ich wollen, entfernen Sie die Windows Forms-Referenzen. Irgendwelche Ideen?
public delegate void SafeInvokeDelegate(System.Action action);
public class SafeInvoke
{
private readonly System.Windows.Forms.Control _threadControl;
public SafeInvoke()
{
_threadControl = new System.Windows.Forms.Control();
}
public void Invoke(System.Action action)
{
if (_threadControl.InvokeRequired)
_threadControl.Invoke(new SafeInvokeDelegate(Invoke), new object[] {action});
else if (action != null) action();
}
}
Die obige Klasse könnte so genutzt werden:
SafeInvoke _safeInvoker = new SafeInvoke();
void SafeClearItems()
{
_safeInvoker.Invoke(delegate
{
listView1.Items.Clear();
});
}
Wie würde ich entfernen, das System.Windows.Formen.Kontrolle in der SafeInvoke Klasse, aber halten die gleiche Funktionalität?
Kommentar zu dem Problem
Beachten Sie, dass die docs umliegenden Invoke() auf der Steuerung sind eigentlich ziemlich subtil. Ich glaube nicht, dass eine generische Klasse ist ausreichend für die Steuerung durch die Interaktion mit IsHandleCreated und IsDisposed (es sei denn, Sie überprüfen Sie immer die ersten in Ihre SafeInvokeDelegate). ( stackoverflow.com/questions/714666 )
Vielen Dank für das teilen dieser Klasse. Hat mir geholfen, meine Probleme zu lösen..
InformationsquelleAutor der Frage CLaRGe | 2009-04-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie könnte auch eine Erweiterung Methode und Lambda-Ausdrücke, um Ihren code viel sauberer.
So, jetzt können Sie
InvokeEx
auf jeden ISynchronizeInvoke und in der Lage sein, um Zugriff auf die Eigenschaften und Felder der Implementierung der Klasse.InformationsquelleAutor der Antwort Samuel
Verwenden
ISynchronizeInvoke
stattControl
. Das ist die Schnittstelle, dieControl
implementiert mitInvoke/BeginInvoke/EndInvoke/InvokeRequired
.Alternative ist die Verwendung
SynchronizationContext.Current
- das ist, wasBackgroundWorker
verwendet, glaube ich.InformationsquelleAutor der Antwort Jon Skeet
Hier ist es in VB.net ähnlich wie in Samuel ' s Antwort. Ich habe vier überladungen je nachdem, ob Sie eine Unterroutine oder Funktion, und ob oder nicht es einen parameter. Wäre es einfach, fügen Sie mehr überladungen für mehr Parameter. VB.Net ableiten der Typen.
Nutzung (führen Sie diese in einen backgroundworker):
InformationsquelleAutor der Antwort Eyal
hier ist der VB-code entspricht, um Samuel die Antwort, die ich benutze. beachten Sie, dass ich tatsächlich 2 extensions-Funktionen, aber ich muss zugeben, ich weiß nicht, warum Sie da sind. ich kopierte meine C# version vor Jahren (vielleicht auch von dieser Seite) und es hatte beide Erweiterungsfunktionen, aber warum, verstehe ich nicht. ich habe gerade kopiert es und wie es zu benutzen, und ich die Hälfte verstehen alle, dass geht auf 'unter der Haube' mit diesen komplizierten Funktionen.
Und die C# - version ist:
Happy coding!
InformationsquelleAutor der Antwort Shawn Kovac
Nun wird ein Tag es ist Einfach Aufrufen e.g sagen, wir wollen rufen Sie ein Label(lblVal), um den Wert txtVal
so einfach ist das 😀
InformationsquelleAutor der Antwort Tj Laubscher