Tenho um método com condição de troca para executar diferentes operações em while
loop com Cancellation
Token, conforme mencionado aqui.
private Task MessagesAsync(CancellationToken cancelToken) => Task.Run(() =>
{
while (!cancelToken.IsCancellationRequested)
{
var message = this.routerSocket.ReceiveMultipartMessage();
if (message is null)
continue;
switch (MessageType)
{
case Email:
OnSendEmail(message);
break;
case SMS:
OnSendSMS(message);
break;
// (Other code)
this.routerSocket.SignalOK();
}
}
}, cancelToken);
Agora eu tenho o OnSendMail
método
private void OnSendEmail(String message)
{
try
{
EmailService.SendEmail(message); // Will throw exception.
}
catch (Exception ex)
{
this.publisherSocket.SendMultipartMessage(ex.Message); // Will send UI notification
}
}
Nisso, EmailService.SendEmail(message)
retornará um erro de operação inválida e deverá capturar a exceção. publisherSocket.SendMultipartMessage()
Notificará a interface do usuário quando algum erro ocorrer.
O problema é que, como esse método é chamado no loop while com Cancellation
token, ele não cancela a execução. Ele faz chamadas constantes para OnSendEmail()
o método e recebemos várias caixas de mensagem com mensagens de erro na interface do usuário.
Como podemos receber apenas uma notificação de erro na interface do usuário? Além disso, quando ocorre um erro, ele não deve fazer chamadas repetidas vezes para OnSendEmail()
.
Devemos restringir a chamada para OnSendEmail()
quando a exceção for capturada. Por favor, me ajude com esta questão.
A opção mais simples é apenas uma bandeira:
Isso naturalmente ocultará todos os erros após o primeiro. Opcionalmente, você pode redefinir o
hasShownError
sinalizador quando o envio for bem-sucedido.Um design potencialmente melhor seria não exibir uma caixa de mensagem modal em caso de erros. Você pode querer exibir um status de erro com a última mensagem de erro e limpá-lo no próximo envio bem-sucedido. Ou você pode querer uma lista mostrando todos os erros únicos. Há muitos designs possíveis. Você também pode querer adicionar um registro com mais detalhes.