我看着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