2012-11-27 55 views
3

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

當異常被趕它是上下文和控制檯應用程序不再關閉內抓獲。

+0

在撞車事故發生前您是否遇到過某種錯誤? –

+0

謝謝Adam。爲了完整起見,異常是System.ServiceModel.FaultException:值不能爲空。這導致我到其他SO線程關於異步例外的控制檯應用程序問題。 – applefish

回答

3

當你調用它異步,異常發生在不同的線程比是處理郵件的一個。出於這個原因,NServiceBus無法知道哪個消息是引發該異常的消息,因此它無法返回任何消息。

使用NServiceBus,你的整體架構已經是異步的 - 實在是沒有任何需要執行這些WCF異步調用。

+0

我認爲這個問題與NServiceBus無關,它與控制檯應用程序如何處理異步調用引發異常有關。 – applefish

+0

感謝您的回覆Udi。如果對WCF服務的調用是同步的,那麼阻塞該線程?我很謹慎,因爲我知道特定服務的響應速度有時會很慢。 – applefish

+0

如果WCF調用是同步的,是的,它會阻塞該線程,但這就是爲什麼你有一個多線程進程。 –