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.