0

.NET 4.5 で await キーワードを使用してできるように、.NET 4 でタスクの結果を待機しようとしています。私はそれを行う方法を理解することはできませんが...

私のコード(少なくとも試していることを証明するため):

    Private Function GetXDocumentFromWebLocationAsync(ByVal request As WebRequest) As XDocument
        Dim queryTask As Task(Of WebResponse)
        queryTask = task(Of WebResponse).Factory.FromAsync(AddressOf request.BeginGetResponse, AddressOf request.EndGetResponse, Nothing, Nothing)
        Return XDocument.Load(queryTask.Result.GetResponseStream)
    End Function

ご想像のとおり、GetResponse 呼び出しは別のスレッドで実行されますが、関数は結果が返るまで待機する必要があります。残念ながら、これはタスクが完了するまでメインスレッドをブロックし、ブロックせずに待機させる方法について少しの手がかりがありません。Async CTP も使用したくありません。これは、問題から逃げているだけだからです。

秘伝のタレとは?

4

1 に答える 1

3

秘伝のタレはありません。非同期操作の結果を返すメソッドを作成する場合は、操作が完了するまでスレッドをブロックするだけです。

しかし、同じことを達成する他の方法があります。.Net でこれを行う「古い」方法は同じWebRequest用途です。次に、操作の完了時に実行されるメソッドにデリゲートを渡すことができます。BeginGetXDocumentEndGetXDocumentBegin

これを行う別の方法は、メソッドから a を返すことTaskです。これを行うには、次を使用できますContinueWith()

Private Function GetXDocumentFromWebLocationAsync(ByVal request As WebRequest) As Task(Of XDocument)
    Dim queryTask As Task(Of WebResponse)
    queryTask = Task(Of WebResponse).Factory.FromAsync(
        AddressOf request.BeginGetResponse, AddressOf request.EndGetResponse, Nothing, Nothing)
    Return queryTask.ContinueWith(
        Function(antecendent) XDocument.Load(antecendent.Result.GetResponseStream))
End Function

このように、メソッドのコンシューマーは結果を同期的に (Wait()またはを使用しResultて) 待機するか、再度使用するかを選択できますContinueWith()

GUI アプリケーションで使用ContinueWith()する場合は注意が必要です。継続はデフォルトで ThreadPool スレッドで実行されます。GUI スレッドで継続を実行するには、 を使用できますTaskScheduler.FromCurrentSynchronizationContext()。または、GUI ライブラリに固有のメソッド ( Dispatcher.Invoke()WPF 内Control.Invoke()、Winforms 内)。

于 2012-04-30T12:31:15.293 に答える