Wie führe ich Code aus, NACHDEM ein Formular geladen wurde?

Wie führe ich Code aus, NACHDEM ein Formular geladen wurde?

Sie könnten das "Shown"-Ereignis verwenden:MSDN - Form.Shown

„Das Shown-Ereignis wird nur ausgelöst, wenn ein Formular zum ersten Mal angezeigt wird; anschließendes Minimieren, Maximieren, Wiederherstellen, Ausblenden, Anzeigen oder Ungültigmachen und Neuzeichnen wird dieses Ereignis nicht auslösen.“


Ich verwende 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.

[aktualisiert auf Anfrage]

Die Control.Invoke/Control.BeginInvoke-Methoden sind für die Verwendung mit Threading vorgesehen und stellen einen Mechanismus dar, um Arbeit auf den UI-Thread zu übertragen. Normalerweise wird dies von Worker-Threads usw. verwendet. Control.Invoke führt einen synchronen Aufruf aus, während Control.BeginInvoke einen asynchronen Aufruf ausführt.

Normalerweise würden diese wie folgt verwendet:

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;
  });
}

Dies geschieht, indem eine Nachricht in die Windows-Nachrichtenwarteschlange verschoben wird. der UI-Thread (irgendwann) holt die Nachricht aus der Warteschlange, verarbeitet den Delegaten und signalisiert dem Worker, dass er abgeschlossen ist ... so weit, so gut;-p

OK; Was passiert also, wenn wir Control.Invoke / Control.BeginInvoke im UI-Thread verwenden? Es kommt zurecht ... wenn Sie Control.Invoke aufrufen, ist es vernünftig genug 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 immer schiebt Arbeit in die Warteschlange, auch wenn wir uns bereits im UI-Thread befinden. Dies ist eine wirklich einfache Art, "gleich" zu sagen, aber ohne die Unannehmlichkeiten von Timern usw. (die sowieso immer noch dasselbe tun müssten!).


Beim ersten Mal wird "AfterLoading" NICHT gestartet,
Es wird nur registriert, um NEXT Load zu starten.

private void Main_Load(object sender, System.EventArgs e)
{
    //Register it to Start in Load 
    //Starting from the Next time.
    this.Activated += AfterLoading;
}

private void AfterLoading(object sender, EventArgs e)
{
    this.Activated -= AfterLoading;
    //Write your code here.
}