Ich benutze manchmal (in Load)
this.BeginInvoke((MethodInvoker) delegate {
// some code
});
oder
this.BeginInvoke((MethodInvoker) this.SomeMethod);
(Ändern Sie "this" in Ihre Formularvariable, wenn Sie das Ereignis auf einer anderen Instanz als "this" behandeln.)
Dadurch wird der Aufruf in die Windows-Forms-Schleife verschoben, sodass er verarbeitet wird, wenn das Formular die Nachrichtenwarteschlange verarbeitet.
[auf Anfrage aktualisiert]
Die Control.Invoke / Control.BeginInvoke-Methoden sind für die Verwendung mit Threading vorgesehen und stellen einen Mechanismus dar, mit dem die Arbeit auf den UI-Thread übertragen werden kann. Normalerweise wird dies von Arbeitsthreads usw. verwendet. Control.Invoke führt einen synchronen Aufruf aus, während Control.BeginInvoke einen asynchronen Aufruf ausführt.
Normalerweise werden diese verwendet als:
SomeCodeOrEventHandlerOnAWorkerThread()
{
// this code running on a worker thread...
string newText = ExpensiveMethod(); // perhaps a DB/web call
// now ask the UI thread to update itself
this.Invoke((MethodInvoker) delegate {
// this code runs on the UI thread!
this.Text = newText;
});
}
Dazu wird eine Nachricht in die Windows-Nachrichtenwarteschlange verschoben. Der UI-Thread stellt die Nachricht (irgendwann) aus der Warteschlange, verarbeitet den Delegaten und signalisiert dem Worker, dass er abgeschlossen wurde ... soweit so gut ;-p
OK; Was passiert also, wenn wir Control.Invoke / Control.BeginInvoke für den UI-Thread verwenden? Es kommt zurecht ... wenn Sie Control.Invoke aufrufen, ist es vernünftig zu wissen, dass das Blockieren der Nachrichtenwarteschlange einen sofortigen Deadlock verursachen würde. Wenn Sie sich also bereits im UI-Thread befinden, wird der Code einfach sofort ausgeführt ... damit hilft uns nicht ...
Aber Control.BeginInvoke funktioniert anders: Es schiebt immer Arbeit in die Warteschlange, auch wenn wir uns bereits im UI-Thread befinden. Dies ist eine wirklich einfache Art, "in einem Moment" zu sagen, aber ohne die Unannehmlichkeiten von Timern usw. (die sowieso immer noch das Gleiche tun müssten!).