我的问题:我想在.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