C# 如何捕获由';在第三方图书馆中不等待什么?

C# 如何捕获由';在第三方图书馆中不等待什么?,c#,exception,async-await,task,topshelf,C#,Exception,Async Await,Task,Topshelf,我有一个依赖于第三方库的Windows服务(使用Topshelf)。不幸的是,我在其中一个库方法中发现了以下代码: public async Task InitializeAsync() { if (SubscriberInfo == null) throw new NullReferenceException("SubscriberInfo is required."); if (string.IsNullOrWhiteSpace(Subscri

我有一个依赖于第三方库的Windows服务(使用Topshelf)。不幸的是,我在其中一个库方法中发现了以下代码:

    public async Task InitializeAsync()
    {
        if (SubscriberInfo == null) throw new NullReferenceException("SubscriberInfo is required.");
        if (string.IsNullOrWhiteSpace(SubscriberInfo.SubscriberId)) throw new NullReferenceException("SubscriberId is required");
        if (string.IsNullOrWhiteSpace(SubscriberInfo.ExchangeName)) throw new NullReferenceException("ExchangeName is required");
        if (string.IsNullOrWhiteSpace(SubscriberInfo.QueueName)) throw new NullReferenceException("QueueName is required");
        if (OnMessageAsync == null) throw new NullReferenceException("OnMessageAsync is required");

        await _cacheClient.SubscribeAsync<string>(SubscriberInfo.ExchangeName, DoWorkAsync);

        DoWorkAsync("").FireAndForget();
    }
方法,我在其中引用了服务(业务逻辑所在的位置):

hostConfigurator.Service(serviceConfigurator=>
{
serviceConfigurator.ConstructUsing(()=>IocContainer.IocContainer.Instance.Resolve());
serviceConfigurator.WhenStarted(consumer=>{/*这里我有控制权*/});
...
}
有人知道如何处理这种情况吗?

订阅TaskScheduler的:

TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
//...

private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
    e.SetObserved();
}

谢谢你的建议。我实际上也查看了TaskScheduler.UnobservedTaskeException,但问题是我需要添加一些代码来重试该操作,而在TaskScheduler\u UnobservedTaskeException中,我无法调用消费者对象上的任何方法(在serviceConfiguration.WhenStarted(consumer=>{…})中指定);看看这段代码,用
FireAndForget
调用的东西永远不会抛出。因此这可能是一个潜在的bug。也许你应该提交一个问题。不幸的是,客户端库已经两年没有更新了,所以我不相信提交bug会有帮助。但我完全同意,最好在库it中处理这个问题self.我没有任何使用
EasyRedisMQ
的经验,但在您提供的源代码中,有一个调用
pushmessagetosubscribereasync
,因此可能有一种订阅此消息的方法。即使处理它时出现异常,也应该将其发送。为什么不放弃repo并根据您的喜好修复它呢?也许作者是st我也愿意接受PR。@Iqon这是一个很好的捕获!但问题是,由于GetNextMessageAsync()行引发了异常,因此它不在任何catch子句的范围内-因此它使我的服务崩溃。
HostFactory.Run(hostConfigurator => { ... }
hostConfigurator.Service<IConsumer>(serviceConfigurator =>
{
    serviceConfigurator.ConstructUsing(() => IocContainer.IocContainer.Instance.Resolve<IConsumer>());
    serviceConfigurator.WhenStarted(consumer => { /* Here I have control */ });
    ...
}
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
//...

private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
    e.SetObserved();
}