0

PostAsync の完全な例が見つからなかったため、1 つをつなぎ合わせる必要がありました。したがって、表示されているものがデバッガーの制限なのか、それとも単純に間違っていたのかはわかりません。

これは私がやろうとしていることです:

リストを調べて、リストの各項目に対して Web サービスを呼び出す必要があります。私の考えでは、新しい 4.5 非同期機能を使用して、Web サービスへの呼び出しごとにブロックすることなく流れを維持できると考えています。

かなりの調査を行い、TekPub で Jon Skeet のビデオを見ましたが、これが正しく行われているかどうかはまだわかりません。つまり、ブレーク ポイントを設定すると、非同期メソッドが呼び出し元に制御を返すことはありません。基本的に、私の同期バージョンとまったく同じように動作するようです。

質問:

デバッガーが同期しているように見えるのは正常ですか、それともコードが正しく実装されていないことを示していますか?

これが私の投稿方法です:

Public Async Function PostSecureXMLAsync(ByVal username As String, ByVal password As String, ByVal XMLtoSend As String) As Task(Of String)

    Dim content = New StringContent(XMLtoSend, Encoding.UTF8, "text/xml")

    Dim credentials = New NetworkCredential(username, password)
    Dim handler = New HttpClientHandler() With {.Credentials = credentials}

    Using client = New HttpClient(handler)

        Using response = client.PostAsync(APIurl, content).Result
            Return Await response.Content.ReadAsStringAsync()
        End Using

    End Using

End Function

これがどのように使用されているかです:

For Each ListItem In ListObj
...
Result = XMLExchangeObj.PostSecureXMLAsync(Username, Password, Payload).Result
...
Next

Web サービスからの応答を待っている間、制御が For Each ループに戻ることを期待していましたが、私のブレーク ポイントに基づいて、同期的に実行されているようです。

4

1 に答える 1

0

で作業しているときは、またはAsyncを呼び出したくありません。代わりに、 を使用する必要があります。に 1 つ表示されます。WaitResultAwaitResultPostSecureXMLAsync

Using client = New HttpClient(handler)
    Using response = Await client.PostAsync(APIurl, content) ' Changed to Await
        Return Await response.Content.ReadAsStringAsync()
    End Using
End Using

そして、メソッドを呼び出すときに別のものがありますAsync:

Result = Await XMLExchangeObj.PostSecureXMLAsync(Username, Password, Payload)

これは、呼び出し元のメソッドも である必要があることを意味します。これは、そのAsyncメソッドを呼び出すすべてのメソッドがを使用する必要があり、 などである必要があることを意味します。コードによるこの「成長」は完全に正常です。自然な停止点 (通常はイベント ハンドラーで、これを作成できます) に到達するまで成長を待ちます。AwaitAsyncAsyncAsync Sub

于 2013-07-11T10:10:25.780 に答える