我的問題:我想在.NET 4和的WinForms應用程序中使用TPL我需要任務延續立即提升所有未處理的異常(「快速拋出」),而不是等待GC
收集Task
。這可能嗎?在TPL中快速拋出未處理的異常
在.NET 4.5與async/await
支持,可以這樣寫:
Public Class AwaitForm Inherits Form Private Async Sub Execute() Dim uiScheduler = TaskScheduler.FromCurrentSynchronizationContext() Try Await Me.LongWork(). ContinueWith(Sub(t) Me.LongWorkCompleted(), uiScheduler) Catch ex As Exception ' yay, possible to handle here ' eg. MsgBox(ex.Message) Throw End Try End Sub Private Async Function LongWork() As Task Await Task.Delay(1000) End Function Private Sub LongWorkCompleted() Throw New Exception("Ups") End Sub End Class
在延續的例外是,如果在Excecute
方法處理不立即拋出。
如何在不支持async/await
的情況下在.NET 4中實現相同的行爲?
這不能回答我的問題 - 我想「快速拋出」任何未處理的異常。也許我因爲處理程序的例子而引入了一些混淆。但想象一下,沒有處理程序。或者任何異常處理程序總是可能會引發異常本身。我希望這些異常可以立即拋出,而不需要TPL將它們吞併爲UnobservedTaskException。 – mancze
@mancze拋出哪裏?你想拆除應用程序? – i3arnon
通過整個調用堆棧提升和冒泡異常。可能有我的自定義處理程序正確處理它的方式。沒有處理程序拆除應用程序,是的。 – mancze