Às vezes eu uso (no Load)
this.BeginInvoke((MethodInvoker) delegate {
// some code
});
ou
this.BeginInvoke((MethodInvoker) this.SomeMethod);
(altere "this" para sua variável de formulário se você estiver manipulando o evento em uma instância diferente de "this").
Isso envia a chamada para o loop do Windows Forms, para que seja processada quando o formulário estiver processando a fila de mensagens.
[atualizado a pedido]
Os métodos Control.Invoke / Control.BeginInvoke destinam-se ao uso com threading e são um mecanismo para enviar trabalho para o thread da interface do usuário. Normalmente, isso é usado por threads de trabalho, etc. Control.Invoke faz uma chamada síncrona, enquanto Control.BeginInvoke faz uma chamada assíncrona.
Normalmente, eles seriam usados como:
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;
});
}
Isso é feito empurrando uma mensagem para a fila de mensagens do Windows; o thread da interface do usuário (em algum momento) remove a fila da mensagem, processa o delegado e sinaliza ao trabalhador que ela foi concluída ... até agora tudo bem ;-p
ESTÁ BEM; então o que acontece se usarmos Control.Invoke / Control.BeginInvoke no thread da interface do usuário? Ele lida ... se você chamar Control.Invoke, é sensato o suficiente saber que o bloqueio na fila de mensagens causaria um impasse imediato - portanto, se você já estiver no thread da interface do usuário, ele simplesmente executará o código imediatamente ... não nos ajuda ...
Mas Control.BeginInvoke funciona de maneira diferente: ele sempre envia trabalho para a fila, mesmo que já estejamos no thread da interface do usuário. Isso faz uma maneira realmente simples de dizer "em um momento", mas sem a inconveniência de temporizadores, etc (que ainda precisariam fazer a mesma coisa!).