0

我想将一个现有的 Forms 项目引入 VS2012 RC,并在一些长过程中添加一些快速的 Async/Await 包装器。我想在Async不更改原始程序的情况下将现有程序包装在等效程序中。

到目前为止,我已经取得了这样的成功:

'old synchronous function:
Public Function UpdateEverything() As Boolean
    'Do lots of predictable updates
    ...
    Return True
End Function

'new asynchronous wrapper:
Public Async Function UpdateEverythingAsync() As Task(Of Boolean)
    Return Await Task.Run(AddressOf Me.UpdateEverything)
End Function

但这仅有效,因为UpdateEverything没有参数。如果原始函数有任何参数,我无法计算出语法。例如,如果我有:

'old synchronous function:
Public Function UpdateSomething(somethingID As Integer) As Boolean
    'Do updates
    ...
    Return True
End Function

我以为会是:

Public Async Function UpdateSomethingAsync(somethingID As Integer) As Task(Of Boolean)
    Return Await Task.Run(Of Boolean)(New Func(Of Integer, Boolean)(AddressOf Me.UpdateSomething))
End Function

但显然不是那么简单。有没有一种简单的方法可以在不重构原始文件的情况下将其包装在 Async 等效项中?

4

1 回答 1

2
Public Async Function UpdateSomethingAsync(somethingID As Integer) As Task(Of Boolean)
    Return Await Task.Run(Of Boolean)(New Func(Of Integer, Boolean)(AddressOf Me.UpdateSomething))
End Function

这个方法有些奇怪:你期望UpdateSomething()方法接收somethingID参数,但你从来没有将它传递给它。您不能UpdateSomething在此处直接用作委托,但可以使用 lambda:

Public Async Function UpdateSomethingAsync(somethingID As Integer) As Task(Of Boolean)
    Return Await Task.Run(Of Boolean)(Function() (UpdateSomething(somethingID)))
End Function

虽然这里不需要Async,但可以通过直接返回Task

Public Function UpdateSomethingAsync(somethingID As Integer) As Task(Of Boolean)
    Return Task.Run(Of Boolean)(Function() (UpdateSomething(somethingID)))
End Function

话虽如此,我同意我之前链接的 Stephen Toub 文章:不要这样做,它只会让你的用户感到困惑,如果他们需要的话,他们可以自己做。

于 2012-07-31T06:59:27.937 回答