gpt4 book ai didi

.net - 在 TPL 中快速抛出未处理的异常

转载 作者:行者123 更新时间:2023-12-02 01:32:05 25 4
gpt4 key购买 nike

我的问题:我想在 .NET 4 下的 WinForms 应用程序中使用 TPL 并且我需要任务延续来立即提升任何未处理的异常(“快速抛出”)而不是等待 GC 收集任务这可能吗?

在支持 async/await 的 .NET 4.5 中,可以这样写:

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 SubEnd Class

如果不在Excecute方法中处理,continuation中的异常会立即抛出。

如何在没有 async/await 支持的情况下在 .NET 4 中实现相同的行为?

最佳答案

首先,您应该知道在 .Net 4.0 中使用 async-await 和 Microsoft.Bcl.Async 是可能的。

但如果没有它,您可以使用 ContinueWith 为任务添加一个延续,并让它仅在出现异常时运行 TaskContinuationOptions.OnlyOnFaulted

Me.LongWork().ContinueWith(Sub(task) MsgBox(task.Exception.Message), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted)

关于.net - 在 TPL 中快速抛出未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33563359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com