Pergunta

Os eventos são síncronos em C#.Eu tenho esse aplicativo onde meu formulário principal inicia um thread com um loop que escuta um stream.Quando algo acontece no stream, um evento é disparado do loop para o formulário principal.

Se o formulário principal estiver lento ou mostrar uma caixa de mensagem ou algo assim, o loop será suspenso.Qual é a melhor maneira de contornar isso?Usando um retorno de chamada e invocação no formulário principal?

Foi útil?

Solução

Hmmm, usei diferentes cenários que dependiam do que eu precisava no momento.

Acredito que BeginInvoke provavelmente seria o mais fácil de codificar, já que você está quase lá.De qualquer forma, você já deve estar usando o Invoke, então basta mudar para BeginInvoke.Usar um retorno de chamada em um thread separado realizará a mesma coisa (desde que você use o pool de threads para enfileirar o retorno de chamada) que usar BeginInvoke.

Outras dicas

Como você está usando um formulário, a maneira mais fácil é usar o Trabalhador de fundo componente.

A classe BackgroundWorker permite que você para executar uma operação em um separado, Rosca dedicada.Demorado operações como downloads e banco de dados transações podem fazer com que seu usuário interface (UI) para parecer que parou de responder enquanto eles estão Executando.Quando você deseja uma interface do usuário responsiva e você se depara com longos atrasos associadas a tais operações, o A classe BackgroundWorker fornece um solução conveniente.

Os eventos são apenas delegados, então use BeginInvoke.(ver Fazendo chamadas de método assíncrono no ambiente .NET)

Você tem algumas opções, conforme já detalhado, mas na minha experiência, é melhor deixar os delegados e o BeginInvoke e usar o BackgroundWorker (v2.0+), pois é mais fácil de usar e também permite interagir com o formulário principal na conclusão do tópico.Em suma, encontrei uma solução muito bem implementada.

System.ComponentModel.BackgroundWorker é de fato um bom ponto de partida.Ele fará seu trabalho assíncrono, fornecerá notificações de eventos importantes e terá maneiras de se integrar melhor aos seus formulários.

Por exemplo, você pode ativar notificações de progresso registrando um manipulador para o evento ProgressChanged.(o que é altamente recomendado se você tiver um processo longo e assíncrono e não quiser que seu usuário pense que o aplicativo travou)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top