我需要将异常从异步后台任务传递给主线程非异步方法

I need to pass an exception from async background task to main thread non async method

我有一个在后台运行的异步任务。此任务将消息发送到 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() 那么我的主线程将阻塞直到我的后台线程完成。还有其他方法吗?我不想让主线程上的方法异步。

您的代码当前正在使用 "fire and forget" 模式,该模式通过忽略任何异常正常运行。如果你不想忽略异常,那么你不应该使用 fire and forget。

您的选择是(按优先顺序):

  1. await(使您的主要方法 async)。
  2. 阻止。
  3. 通知。 "notify" 究竟如何工作取决于主线程的工作方式(何时以及如何接收信号)。

I need to bubble the exception up to my circuit breaker class.

因此,应用以上选项:

  1. await(使您的断路器 async 兼容)。
  2. 阻止。
  3. 通知。但是您的主线程将不得不阻塞等待通知,然后再返回断路器代码。

由于 "notify" 方法已缩减为 "block",它不再是真正可行的解决方案。

这使您只能选择异步或阻塞。

我推荐asyncreplace your circuit breaker with Polly's, which already has async support built-in.

可能更容易