gpt4 book ai didi

vb.net - Task.Run - 处理异常

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

我有一个如下函数(仅保留本示例的相关代码):

Public Async Function RefreshCompanyCodesAsync() As Task(Of Boolean)
For ctr=1 to 2000
Await Task.Delay(1000).ConfigureAwait(False)
If ctr=5 Then Throw New ApplicationException("Why 5?")
Next
return true
End Function

如您所见,当 ctr = 5 时,我生成一个异常,只是为了检查 UI 中如何处理该异常。

然后,我在按钮单击 Async 事件中调用此函数:

Dim task1 = Task.Run(Sub()
RefreshCompanyCodesAsync()
End Sub)
Dim cTask = task1.ContinueWith(Sub(antecedent)
If task1.Status = TaskStatus.RanToCompletion Then
MsgBox("All done")
ElseIf task1.Status = TaskStatus.Faulted Then
MsgBox(task1.Exception.GetBaseException().Message)
End If
End Sub)

任务运行完成而不是出错。我猜测这是因为包装器任务运行完成,而不是引发异常的原始任务。但是,我不确定如何转到原始任务并处理异常。

我尝试过Await

    Try
Await RefreshCompanyCodesAsync()
Catch ax As AggregateException
MsgBox(ax.Message)
Catch ex As Exception
MsgBox(ex.Message)
End Try

此处捕获了异常,但问题是我需要并行启动多个功能,其中 RefreshCompanyCodesAsync 只是其中之一。为此,我相信通过 Task.Run 启动这些功能将是最好的选择。

在我的例子中,工作函数的实际功能涉及广泛的数据库和 HttpClient 事件,在此期间,UI 响应能力正在插入我进入 Task.Run > 或 Factory.StartNew

此外,已尝试启动任务并等待它以确保对结果进行评估。但是,当我执行 Task.Wait 时,我的 UI 被阻止。

非常感谢任何帮助。

最佳答案

也许,你想要的是

Dim task1 = RefreshCompanyCodesAsync()

这样就没有包装器任务了。 RefreshCompanyCodesAsync 已经是非阻塞的,这一点很重要,这样您就不会卡住 UI。

您应该避免ContinueWith。更喜欢等待,因为它会将您编码回 UI 线程。

我需要用 C# 编写:

var task1 = RefreshCompanyCodesAsync();
await Task.WhenAny(task1); //Wait without throwing.
MessageBox.Show(task1.Status.ToString());

关于vb.net - Task.Run - 处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37469358/

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