首页 > 解决方案 > 我应该如何修改此代码以适应异步行为?

问题描述

我有一个按钮。如果按下按钮,我希望禁用所有按钮。然后我想做点什么。完成后,我希望重新启用所有按钮。

简单吧?

这是代码

Public Sub startAndStopClickingButton(ByVal sender As Object, ByVal SomeSub As System.Action)
    startClickingButton(sender)
    SomeSub.Invoke()
    stopClickingButton(sender)
End Sub

然后我做

Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles cmdGroupRepeat.Click
    startAndStopClickingButton(sender, Sub()
                                           finRepeatOrdering() ' this one never end
                                           Dim b = 1
                                       End Sub)
End Sub

它工作得很好。Startclickingbutton 被调用。然后我调用中间的任何 lambda。然后在它完成后(实际上从来没有),调用 stopclickingbutton 。简单的。

然后我改变了我的程序。finRepeatOrdering 现在是 finRepeatOrderingAsync。

但是,我仍然想要相同的行为。我希望在按下 stopClickingButton 之前等待 finRepeatOrderingAsync 完成。

所以,我做了这个

Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles cmdGroupRepeat.Click
    startAndStopClickingButton(sender, Async Sub()
                                           Await finRepeatOrderingAsync() ' this one never end
                                           Dim b = 1 'a breakpoint here
                                       End Sub)
End Sub

现在 dim b=1 永远不会被调用。但是,过早地调用了 stopClickingButton。怎么来的?

我应该如何更改程序以使其正常工作?

我试过了

Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles cmdGroupRepeat.Click
    startAndStopClickingButton(sender, Async Function() As Task
                                           Await finRepeatOrderingAsync() ' this one never end
                                           Dim b = 1
                                       End Function)
End Sub

Public Async Function startAndStopClickingButton2(ByVal sender As Object, ByVal SomeSub As System.Func(Of Task)) As Task
    startClickingButton(sender)
    Await SomeSub.Invoke()
    stopClickingButton(sender)
End Function

我收到了编译器警告

严重性代码 描述 项目文件行抑制状态警告 BC42359 从此异步函数返回的任务将被删除,其中的任何异常都将被忽略。考虑将其更改为 Async Sub,以便传播其异常。nicehash2 H:\business\shared\Dropbox\vb.net\nicehashform.vb 60 活动

标签: vb.netasynchronousasync-await

解决方案


尝试这个:

Public Async Function startAndStopClickingButton(ByVal sender As Object, ByVal SomeSub As System.Func(Of Task)) As Task
    startClickingButton(sender)
    Await SomeSub.Invoke()
    stopClickingButton(sender)
End Function

Private Async Sub Button2_Click_1(sender As Object, e As EventArgs) Handles cmdGroupRepeat.Click
    Await startAndStopClickingButton(sender, Async Function() As Task
                                           Await finRepeatOrderingAsync()
                                           Dim b = 1
                                       End Sub)
End Sub

推荐阅读