我有一个在后台运行的异步任务。此任务将消息发送到apache kafka服务器。每当网络出现问题时,都会导致异常。但是主线程无法捕获此异常。
这是我在后台线程任务中使用的代码 -
async SendMessageAsync() {
await Task.WhenAll(sendTasks.ToArray()).ContinueWith(e => e.Exception);
}
虽然我的主线程非异步方法像 -
一样运行try
{
Message[] messages = { new Message(msg) };
var res = _KafkaProducer.SendMessageAsync(topic, messages, acks, timeout, codec);
}
catch (Exception ex)
{
Console.WriteLine("Here");
}
控件永远不会进入Console.writeLine语句。如果我在主线程中实现task.wait(),那么我的主线程将阻塞,直到我的后台线程完成。有没有其他方法可以做到这一点?我不想让主线程上的方法异步。
答案 0 :(得分:1)
您的代码目前正在使用“即发即弃”模式,该模式通过忽略任何异常而正常运行。如果您不想忽略异常,那么您不应该使用fire而忘记。
您的选择(按优先顺序排列):
await
(制作主要方法async
)。我需要将异常冒泡到我的断路器类。
所以,应用上面的选项:
await
(使您的断路器async
兼容)。由于“通知”方法已经减少为“阻止”,因此它不再能够成为一种解决方案。
这会将您的唯一选项留作异步或阻止。
我推荐async
。 replace your circuit breaker with Polly's, which already has async
support built-in可能更容易。