我看着NServiceBus v3.3.0.0,在我们的MessageHandler它调用外部WCF服务。NServiceBus的handleMessage异步导致崩溃
如果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);
}
}
但如果调用service.UpdateAsync抛出一个异常,那么进程崩溃
public class LeagueMessageHandler : IHandleMessages<LeagueMessage>
{
public async void Handle(LeagueMessage message)
{
var service = new LeagueService.LeagueContractClient();
var league = await service.UpdateAsync(leagueDto);
}
}
的WCF服务只是作为服务引用添加到类库中,它会生成异步方法包装器。
在Adam和Udi评论后编辑。
它看起来像问题无关NServiceBus它更与控制台应用程序如何处理异步方法抛出异常的事情。请参阅线程
Catch unhandled exceptions from async
斯蒂芬·克利里写了这
http://nuget.org/packages/Nito.AsyncEx
它可以帮助你滚你自己SynchronisationContext它处理捕捉异常。所以,上面的WCF调用包装等...
var league = AsyncContext.Run(() => service.UpdateAsync(leagueDto));
当异常被赶它是上下文和控制台应用程序不再关闭内抓获。
在撞车事故发生前您是否遇到过某种错误? –
谢谢Adam。为了完整起见,异常是System.ServiceModel.FaultException:值不能为空。这导致我到其他SO线程关于异步例外的控制台应用程序问题。 – applefish