NServiceBus HandleMessage异步导致崩溃

NServiceBus HandleMessage异步导致崩溃,nservicebus,Nservicebus,我正在看NServiceBus v3.3.0.0,在我们的MessageHandler中,它调用外部WCF服务 如果同步调用WCF服务,并且该服务引发异常,则NServiceBus会完美地处理该异常,并根据配置重试该过程 但是,如果异步调用WCF服务并引发异常,则订户进程将崩溃 例如,如果service.Update抛出 public class LeagueMessageHandler : IHandleMessages<LeagueMessage> {

我正在看NServiceBus v3.3.0.0,在我们的MessageHandler中,它调用外部WCF服务

如果同步调用WCF服务,并且该服务引发异常,则NServiceBus会完美地处理该异常,并根据配置重试该过程

但是,如果异步调用WCF服务并引发异常,则订户进程将崩溃

例如,如果service.Update抛出

   public class LeagueMessageHandler : IHandleMessages<LeagueMessage>
   {
       public void Handle(LeagueMessage message)
       {
           var service = new LeagueService.LeagueContractClient();
           var league = service.Update(leagueDto);
       }
   }

当抛出异常时,它会在该上下文中被捕获,并且console应用程序不再关闭。

当您将其称为async时,异常发生在与处理消息的线程不同的线程上。由于这个原因,NServiceBus无法知道是哪条消息导致了该异常,因此它无法回滚任何内容


当使用NServiceBus时,您的整体架构已经是异步的-实际上不需要异步执行这些WCF调用。

在崩溃之前您是否遇到了某种错误?谢谢Adam。为完整性起见,异常为System.ServiceModel.FaultException:值不能为null。这让我找到了关于控制台应用程序异步异常问题的另一个SO线程。我认为这个问题与NServiceBus无关,更多的是控制台应用程序如何处理引发异常的异步调用。感谢您的回复Udi。如果对WCF服务的调用是同步的,那么会阻止该线程吗?我很谨慎,因为我知道特定的服务有时响应速度很慢。如果WCF调用是同步的,是的,它会阻止线程,但这就是为什么您有一个多线程进程。@UdiDahan从我对async await的理解来看,使用它有很好的理由(即使在已经线程化的应用程序中)。原因是,当您对要发送到远程系统的操作调用wait时,线程会脱水并返回到线程池,直到远程系统响应为止。这意味着运行的并发线程更少。请参阅@LukeMcGregor NServiceBus在本例中不能/不会释放线程,因为它需要解决环境消息事务,因此使用async/Wait并不能真正提高性能或降低资源利用率。
   public class LeagueMessageHandler : IHandleMessages<LeagueMessage>
   {
       public async void Handle(LeagueMessage message)
       {
           var service = new LeagueService.LeagueContractClient();
           var league = await service.UpdateAsync(leagueDto);
       }
   }
        var league = AsyncContext.Run(() => service.UpdateAsync(leagueDto));