Pergunta

Pegue um aplicativo .Net Winforms.misture uma conexão de rede sem fio flakey, misture com alguns usuários que gostam de simplesmente desconectar o plugue azul ocasionalmente e, para garantir, adicione um administrador de sistemas que decida reinicializar a caixa do servidor SQL sem avisar de vez em quando, apenas para manter todos ligados seus dedos dos pés.

Quais são as sugestões e estratégias para lidar com esse tipo de cenário em relação a:

  • Manuseio de erros - por exemplo, você envolve todas as chamadas para o servidor com uma tentativa/captura ou confia em alguma forma de manuseio de erros genéricos para gerenciar isso?Se sim, como é?

  • Gerenciamento de aplicativos - por exemplo, você desativa o aplicativo e não permite que os usuários interajam com ele até que uma conexão seja detectada novamente?O que você faria?

Foi útil?

Solução

A resposta depende do tipo de sua aplicação.Existem aplicativos que podem funcionar offline – Microsoft Outlook, por exemplo.Esses aplicativos não tratam as exceções de conectividade como críticas; eles podem salvar seu trabalho localmente e sincronizá-lo posteriormente.Outros aplicativos, como jogos online, tratarão problemas de comunicação como uma exceção crítica e serão encerrados se a conexão for perdida.

No que diz respeito ao tratamento de erros, acho que você deve controlar exceções em todas as camadas, em vez de depender de algum código geral de tratamento de exceções.Sua camada de negócios deve entender o que aconteceu na camada inferior (camada de acesso a dados no nosso caso) e responder de forma correspondente.A conexão perdida não deve ser tratada como exceção inesperada na minha opinião.Para boas práticas de gerenciamento de exceções recomendo dar uma olhada em Bloco de aplicação de tratamento de exceções.

Em relação ao comportamento do aplicativo, você deve responder à seguinte pergunta "Meu aplicativo tem valor comercial para o cliente em estado desconectado?" Em muitos casos, seria benéfico acabar com o usuário ser capaz de continuar seu trabalho em estado desconectado.No entanto, tal comportamento é tremendamente difícil de implementar.

Especialmente para o seu cenário a Microsoft desenvolveu Bloqueio de aplicativo do agente de serviço desconectado

Outras dicas

Não toco em WinForms e .NET há anos, então não posso fornecer nenhum detalhe técnico, mas há uma resposta mais detalhada:

Em primeiro lugar - não vincule os dados do seu formulário diretamente a um banco de dados.

Crie uma camada de dados/modelo separada à qual você vincula seus widgets de formulário.

A partir daí, você tem várias opções disponíveis, dependendo do nível de estabilidade e disponibilidade que precisa fornecer.

Provavelmente, uma das soluções mais simples aqui seria apenas ativar/desativar as partes do aplicativo que precisam interagir com um banco de dados com base no estado da conexão.

O próximo nível de proteção incluiria o cache local de parte do modelo de dados e, enquanto a conexão com o banco de dados estiver inativa, o uso do cache local para visualizar e desabilitar quaisquer funções que exijam conexão explícita com o banco de dados.

Provavelmente a coisa mais complicada (que também pode fornecer a experiência mais estável para o usuário final) é replicar o banco de dados localmente e usar algum tipo de esquema de sincronização para manter sua cópia do banco de dados sincronizada com o banco de dados remoto.

Isso pode ser um pouco também muito suporte para o cenário offline, mas você já considerou o "Estrutura de sincronização da Microsoft"?Incluído na estrutura está o "Sync Services for ADO.NET 2.0", que permite que seu aplicativo acesse uma instância local do SQL Server CE.Isso pode ser facilmente sincronizado com um SQL Server central por meio de vários métodos.

Este framework lida com o cenário offline permanente e, como eu disse, pode não ser apropriado para seus requisitos específicos, mas dará ao seu aplicativo um suporte offline sólido.

Temos isso em nosso Main() método que captura todas as exceções não tratadas ...

Application.ThreadException += new 
System.Threading.ThreadExceptionEventHandler(UnhandledExceptionCatcher);

Thread.GetDomain().UnhandledException += new 
UnhandledExceptionEventHandler(Application_UnhandledException);

e então Application_UnhandledException e UnhandledExceptionCatcher exibir mensagens amigáveis.

Além disso, o aplicativo envia por e-mail dados como rastreamento de pilha para os desenvolvedores, o que pode ser muito útil.

Depende do aplicativo, é claro, mas para o tipo de falha que você descreve, eu fecharia o aplicativo.

Em nossa aplicação, damos ao usuário a opção de se conectar a outro servidor, por exemplo, se a conexão com o banco de dados falhar, uma caixa de diálogo será exibida informando que o servidor não está disponível e ele poderá inserir outro endereço IP para tentar.

Use algo como SQLite para armazenar dados off-line até que uma conexão esteja disponível.

Atualizar:Eu acredito que SQLite é o back-end para Google Engrenagens, que, pelo que entendi, faz o que você procura em aplicativos da web ...embora eu não saiba se pode ser usado em um contexto que não seja da web.

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