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ここでデリゲートとして直接使用することはできませんが、ラムダを使用できます。

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 に答える