2017-04-26 53 views
-2

我有一个在后台运行的异步任务。该任务将消息发送到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

所以你想异步等待,但不是异步。你不想等待电话结束,但你想等待电话结束捕捉异常? – Default

+0

为什么你需要捕获主线程中的异常?你可能会创建一个封装方法来捕获和处理这个调用吗?或者只是捕获并处理SendMessageAsync中的异常 – Default

+0

我正在寻找一种方法,不需要我在主线程异步执行方法,并且还要等待后台线程的执行完成。 –

回答

1

您的代码当前正在使用“fire and forget”模式,该模式通过忽略任何异常而表现正确。如果你不想忽略异常,那么你不应该用火和遗忘。

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

  1. await(让你的主要方法async)。
  2. Block。
  3. 通知。 “通知”的工作方式取决于您的主线程如何工作(何时以及如何接收信号)。

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

因此,应用上述选项:

  1. await(让你的断路器async兼容)。
  2. Block。
  3. 通知。但是您的主线程必须在返回到断路器代码之前等待通知

由于“通知”方法已被减少为“阻止”,因此它不再是真正成为解决方案的可行方式。

这使您的唯一选项成为异步或阻塞。我想推荐async。这可能会更容易replace your circuit breaker with Polly's, which already has async support built-in