我需要将异常从异步后台任务传递给主线程非异步方法
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。
您的选择是(按优先顺序):
await
(使您的主要方法 async
)。
- 阻止。
- 通知。 "notify" 究竟如何工作取决于主线程的工作方式(何时以及如何接收信号)。
I need to bubble the exception up to my circuit breaker class.
因此,应用以上选项:
await
(使您的断路器 async
兼容)。
- 阻止。
- 通知。但是您的主线程将不得不阻塞等待通知,然后再返回断路器代码。
由于 "notify" 方法已缩减为 "block",它不再是真正可行的解决方案。
这使您只能选择异步或阻塞。
我推荐async
。 replace your circuit breaker with Polly's, which already has async
support built-in.
可能更容易
我有一个在后台运行的异步任务。此任务将消息发送到 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。
您的选择是(按优先顺序):
await
(使您的主要方法async
)。- 阻止。
- 通知。 "notify" 究竟如何工作取决于主线程的工作方式(何时以及如何接收信号)。
I need to bubble the exception up to my circuit breaker class.
因此,应用以上选项:
await
(使您的断路器async
兼容)。- 阻止。
- 通知。但是您的主线程将不得不阻塞等待通知,然后再返回断路器代码。
由于 "notify" 方法已缩减为 "block",它不再是真正可行的解决方案。
这使您只能选择异步或阻塞。
我推荐async
。 replace your circuit breaker with Polly's, which already has async
support built-in.