Visual Basic, VB .NET, ASP, Active X, Access, SQL Server

MVVM: eliminando a necessidade de callbacks para exibir views modais

A partir Na plataforma 4.5, foram criadas duas novas palavras chave: Async e Await. Declarando um método como Async, ao ser chamado, ele rodará em segundo plano se a chamada for precedida pela palavra Await. Mesmo o método estando a rodar de modo assíncrono, sua aplicação parará a execução no ponto da chamada ao método, mas não deixará de responder a outros comandos do usuário na interface gráfica ou a quaisquer eventos que afetem ao programa. Quando o método assíncrono retornar, a aplicação continuará do ponto em que parou. Isto elimina a necessidade de callbacks na plataforma 4.5.

Na documentação da classe DispatcherFrame, encontrei um procedimento DoEvents que faz com que sua aplicação processe todas as mensagens da fila de mensagens da aplicação como fazia o antigo DoEvents no Visual Basic 6.0. Isto era usado no meio de loops demorados que fariam com que a aplicação parasse de responder aos comandos do usuário. O equivalente para .NET é este procedimento abaixo:

<SecurityPermissionAttribute(SecurityAction.Demand, Flags := SecurityPermissionFlag.UnmanagedCode)>

Public Shared Sub DoEvents()

Dim frame As New DispatcherFrame()

Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, New DispatcherOperationCallback(AddressOf ExitFrame), frame)

Dispatcher.PushFrame(frame)

End Sub

Private Shared Function ExitFrame(f As Object) As Object

DirectCast(f, DispatcherFrame).[Continue] = False Return Nothing

End Function

Usando o procedimento DoEvents acima, criei um procedimento que equivale ao await da plataforma 4.5 para exibição de views modais, mas que funciona em todas as versões da plataforma a partir da 3.0:

Public Shared Function AwaitWhile(breakLoopInnerCondition As Func(Of Boolean), whileCondition As Func(Of Boolean)) As Integer

Do

If breakLoopInnerCondition() Then

Return -1

End If

DoEvents()

Loop While whileCondition()

Return 0

End Function

Desta forma, você pode, por exemplo, exibir uma janela, ou um controle que funcione como uma caixa de diálogo e desabilitar apenas aquelas partes da interface que você quer que não respondam a ações do usuário enquanto determinadas condições se verificarem, por exemplo, enquanto o controle ou janela estiver visível. Seu código irá parar no ponto da chamada a esta ação sem que o restante da aplicação deixe de responder. Assim,você não precisa usar callbacks para este tipo de tarefa.

O código acima é para o uso com WPF. Para usar com Windows.Forms, pode-se substituir este DoEvents pelo System.Windows.Forms.Application.DoEvents.