Grüße, Ich entwickle eine Anwendung in C#. Im Moment beschäftige ich mich mit Threading und ich habe eine Frage, die ich in meinem Kopf habe. Was ist der Unterschied zwischen Invoke und BeginInvoke? las ich etwas Faden und ich fand einige nützliche Informationen hier: hereInvoke und BeginInvoke
jedoch, was der Unterschied zwischen Invoke und BeginInvoke in dem folgenden Code ist:
private void ProcessRoutine()
{
for (int nValue = StartFrom; nValue <= EndTo; nValue++)
{
this.Invoke(this.MyDelegate, nValue);
//this.BeginInvoke(this.MyDelegate, nValue);
}
MessageBox.Show("Counting complete!");
}
private void MessageHandler(int progress)
{
lblStatus.Text = lblStatus.Text = "Processing item: " + progress.ToString();
progressBar1.Value = progress;
}
wo MyDelegate ein Verweis auf Messagefunktion ist.
Ich habe festgestellt, dass BeginInvoke lblStatus.Text nicht aktualisiert wird, wenn die Verwendung von Invoke das Etikett aktualisiert. Außerdem weiß ich, dass Invoke wartet, bis seine Ausführung abgeschlossen ist. Der wichtigste Fall, der mich interessiert, ist, warum es in diesem Fall einen Unterschied beim Aktualisieren von Etikettentext gibt.
BeginInvoke aufrufen, bedeutet nicht, es nicht auf der Benutzeroberfläche ausgeführt ist Faden. Das bedeutet, dass es asynchron für den Thread aufgerufen wird, der mit "this" verknüpft ist. Dies könnte der UI-Thread sein. –
also, wenn es nicht in einem anderen Thread ist, wie funktioniert es dann? –
Von MSDN: "Führt den angegebenen Delegaten asynchron für den Thread aus, auf dem das zugrunde liegende Steuerelement des Steuerelements erstellt wurde". Wenn es also vom Benutzeroberflächenthread aufgerufen wird, wird es in eine Warteschlange gestellt und ausgeführt, wenn es sich im UI-Thread im Leerlauf befindet. Was wird sein, nachdem die aktuell ausgeführte Methode zurückgegeben wurde. –