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

时间:2017-04-26 07:37:37

标签: c# multithreading exception .net-4.5

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

1 个答案:

答案 0 :(得分:1)

您的代码目前正在使用“即发即弃”模式,该模式通过忽略任何异常而正常运行。如果您不想忽略异常,那么您不应该使用fire而忘记。

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

  1. await(制作主要方法async)。
  2. 块。
  3. 通知。究竟“通知”将如何工作取决于主线程如何工作的滞留(何时以及如何接收信号)。
  4.   

    我需要将异常冒泡到我的断路器类。

    所以,应用上面的选项:

    1. await(使您的断路器async兼容)。
    2. 块。
    3. 通知。但在返回断路器代码之前,您的主线程必须阻止等待通知
    4. 由于“通知”方法已经减少为“阻止”,因此它不再能够成为一种解决方案。

      这会将您的唯一选项留作异步或阻止。

      我推荐asyncreplace your circuit breaker with Polly's, which already has async support built-in可能更容易。