我正在使用 NATS 机制在不同进程之间发布事件,当我订阅一个主题并提供处理该主题的异步操作时,如果处理该主题的操作抛出异常,我无法捕获它,因为我不这样做等待调用。
问题是“connection.subscribeAsync”参数如下:
delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
我使用自定义属性来确定该操作是异步操作还是同步操作
如果是异步的,我使用反射从 Action 构建任务;
但在这一点上,看起来我必须在两个糟糕的选择之间做出选择,
第一种是使用 GetAwaiter().GetResults();
第二个是执行方法 - async void 并用 try 和 catch 包装调用,这样我将捕获在同步上下文之前发生的异常。
我很想听到任何解决这些问题的建议。
代码快照:
async void MsgEvent(object sender, EncodedMessageEventArgs eArgs)
{
try
{
if (IsAsyncAction(request.Action))
{
await (Task)request.Action.GetMethodInfo()
.Invoke(request.Action, new object[] { eArgs });
}
.
.
.
}
catch (Exception e)
{
_logger.LogError(e.Message);
}
}
var subscription = connection.SubscribeAsync(request.Topic, MsgEvent);
/// <summary>
/// Expresses interest in the given <paramref name="subject" /> to the NATS Server, …Run Code Online (Sandbox Code Playgroud)