Vb.net 我应该如何修改此代码以适应异步行为?

Vb.net 我应该如何修改此代码以适应异步行为?,vb.net,asynchronous,async-await,Vb.net,Asynchronous,Async Await,我有一个钮扣。如果按下按钮,我希望所有按钮都被禁用。那我想做点什么。完成后,我希望所有按钮都重新启用 简单对吧 这是密码 Public Sub startAndStopClickingButton(ByVal sender As Object, ByVal SomeSub As System.Action) startClickingButton(sender) SomeSub.Invoke() stopClickingButton(sender) End Sub 那么

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

简单对吧

这是密码

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

然而,我仍然想要同样的行为。我想等待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此异步函数返回的任务将被删除,其中的任何异常都将被忽略。考虑将其更改为异步子,从而传播其异常。nicehash2 H:\business\shared\Dropbox\vb.net\nicehashform.vb 60 Active

尝试以下操作:

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

为什么使用invoke而不是Task.run?你可以试试

Public Async Sub startAndStopClickingButton(ByVal sender As Object, ByVal SomeSub As System.Action)
    startClickingButton(sender)
    Await Task.Run(SomeSub) 
    stopClickingButton(sender)
End Sub
这个代码成功了

Private Async Sub RepeatTheWholeThing_Click_1(sender As Object, e As EventArgs) Handles cmdGroupRepeat.Click
    Await startAndStopClickingButton2(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
处理程序本身需要是异步的。然后开始和停止单击按钮也需要是异步的。与保罗的回答唯一不同的是,我等待开始并停止点击按钮2

要了解这是如何工作的,我们需要看到等待并没有真正阻止。它返回给调用者。完成
等待SomeSub.Invoke()
后,事件处理程序将运行并执行stopClickingButton(发送方)


如果有更好的解决方案。我想知道处理程序是否必须是异步的,或者是否真的需要更改startAndStopClickingButton。若然,原因为何?那将是另一个问题。

我收到一个编译器警告。什么编译器警告?我忘了。但是想想看。startAndStopClickingButton是一个返回任务的异步函数。应该等着吧?但不需要。只需调用异步函数而不等待。