Formulário MDI - Créditos da imagem: http://sharpertutorials.com Muitas vezes é necessário fechar um formulário filho de MDI antes mesmo de exibí-lo, como por exemplo, um controle de usuários: Se o usuário não tiver acesso ao formulário, o mesmo é fechado.

Podemos fazer essa verificação de diversas maneiras. Eu costumo fazer no evento Load() do formulário em questão, chamando uma função onde passo o nome do form e o perfil do usuário.

Mas você pode dizer: Ah, isso é “moh” simples de fazer, é só fazer o “if” e chamar o método Close() do formulário se a condição não bater. Assim:

private void Form1_Load(object sender, EventArgs e)
{
	if(MeuMetodoVerificador())
	{
		this.Close();
	}
}	

Tá… executa isso pra vc ver a bela exceção que irá disparar na sua tela: Ele diz que não pode chamar o método Close() enquanto o handler do formulário está sendo criado. E agora, #comofas?

Faça assim:

private void Form1_Load(object sender, EventArgs e)
{
	if(MeuMetodoVerificador())
	{
		this.Invoke(new MethodInvoker(Close));
	}
}	

Com o método Invoke(), que pede como parâmetro o delegate do método a ser executado, da classe Form, ele executará o método Close() assincronamente, na thread do objeto que é o pai do form a ser aberto. Hã?

Suponha que o formulário que você quer fazer a verificação de acesso seja um “filho” de um formulário MDI. O handler deste formulário estará associado ao form MDI pai. Nesse caso serão 2 threads: uma do form MDI e a outra do filho. No evento Load() do filho, o handler ainda não está completamente criado, e ao chamar o método Close() diretamente irá causar o erro que falei acima.

Caso chamemos o método Close() através do método Invoke(), passando como parâmetro o delegate do método Close() através de uma instância da classe MethodInvoker() (que pede o método-alvo como parâmetro na sobrecarga que utilizamos acima) estaremos executando o Close() através da thread do formulário MDI, não vinculando-o ao handler do formulário filho.

Assim sendo podemos fazer quaisquer verificações possíveis no evento Load() com a finalidade de exibir ou não o form.

Um abraço!