Callbacks em Windows Forms


Como sabemos, ao desenvolver aplicações em Windows Forms, os controles são criados sob a thread que é iniciada junto ao processo. Com isso, os controles tem uma afinidade com esta thread e, sendo assim, toda e qualquer alteração em cima destes controles, será necessário que seja realizada através da própria thread que os criou.

Quando utilizamos o recurso de callbacks do WCF, é muito comum implementarmos a interface de callback no próprio formulário Windows, fazendo a atualização de controles que estão dentro do próprio formulário. Quando o callback for executado pelo runtime do WCF, ele será disparado em uma thread diferente da thread de criação dos controles e, seguramente, teremos uma exceção sendo disparada justamente devido a questão de afinidade que os controles possuem.

Em uma configuração padrão, ao fazer isso a exceção não ocorrerá. Isso se deve ao fato de que, se o método do proxy (isso envolve também o método Open) for invocado a partir de algum evento gerado pela UI (Form.Load, Button.Click, etc.), ele estabelecerá a afinidade com esta thread e, quando o callback acontecer, automaticamente ele será executado nesta mesma thread, ou seja, a mesma que efetuou a chamada e que também, é a mesma que criou os controles.

Isso é garantido porque o WCF faz o uso de uma classe chamada SynchronizationContext. Esta classe permite executarmos uma determinada tarefa em uma outra thread, diferente da qual estamos atualmente, representando uma espécie de canal entre as duas threads envolvidas. Quando o callback ocorrer, o WCF utilizará este mecanismo para executar o mesmo na própria thread de criação dos controles. Mas lembre-se de que isso somente acontece porque ao fazer a chamada, ele conseguiu estabelecer o contexto com a thread atual.

É importante dizer que voce pode controlar o uso do SynchronizationContext. Para isso, recorremos à propriedade booleana chamada UseSynchronizationContext, que é exposta através do atributo CallbackBehaviorAttribute, que pode ser aplicada à classe que implementa a interface de callback que, neste caso, é o próprio formulário Windows.

Anúncios

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s