0

IXMLHTTPRequest2 / IXMLHTTPRequest2Callbackインターフェイスを使用して、HTTP要求を送信し、応答を処理しています。以下の呼び出しスタックに示すように、応答コールバック(OnHeadersAvailable()など)が要求を送信したスレッドとは異なるスレッドで呼び出される場合もあれば、要求を送信したのと同じスレッドでコールバックが呼び出される場合もあります。 :

my.dll!xxxXMLHTTPRequest2Callback::OnHeadersAvailable(IXMLHTTPRequest2 * pXHR, unsigned long dwStatus, const wchar_t * pwszStatus) Line 185 C++
msxml6.dll!URLMONRequest::_CallOnHeadersAvailable() Line 305    C++
msxml6.dll!URLMONRequest::_OnResponse(unsigned long dwResponseCode, const wchar_t * pwszResponseHeaders, const wchar_t * pwszRequestHeaders) Line 2946  C++
msxml6.dll!URLMONRequest::OnResponse(unsigned long dwResponseCode, const wchar_t * pwszResponseHeaders, const wchar_t * pwszRequestHeaders, wchar_t * * ppwszAdditionalRequestHeaders) Line 2993    C++
msxml6.dll!URLMONRequest::URLMONRequestSink::OnResponse(unsigned long dwResponseCode, const wchar_t * szResponseHeaders, const wchar_t * szRequestHeaders, wchar_t * * pszAdditionalRequestHeaders) Line 212    C++
urlmon.dll!CINetHttp::QueryStatusOnResponseDefault()    Unknown
urlmon.dll!CINetHttp::QueryStatusOnResponse()   Unknown
urlmon.dll!CINetHttp::INetAsyncSendRequest()    Unknown
urlmon.dll!CINetHttp::INetAsyncOpenRequest()    Unknown
urlmon.dll!CINet::INetAsyncConnect()    Unknown
urlmon.dll!CINet::INetAsyncOpen()   Unknown
urlmon.dll!CINet::StartCommon() Unknown
urlmon.dll!CINet::Start()   Unknown
msxml6.dll!URLMONRequest::send(tagVARIANT varBody) Line 838 C++
msxml6.dll!XMLHttp::send(tagVARIANT varBody) Line 549   C++
msxml6.dll!XMLHttp2::_Send(ISequentialStream * pBody, unsigned __int64 cbBody) Line 2440    C++
msxml6.dll!XMLHttp2::Send(ISequentialStream * pBody, unsigned __int64 cbBody) Line 2993 C++

これは非同期インターフェースとして文書化されているため、コールバックは常に別のスレッドで呼び出されると予想していました。リクエストを送信するスレッドとは異なるスレッドでコールバックが常に呼び出されることを保証できる方法はありますか?情報ありがとうございます。

4

2 に答える 2

0

「非同期」とは、結果が処理可能になるまでスレッドプールからスレッドを消費しないことを意味します。

独自のプールマネージャーを作成する以外に、非同期要求の結果を特定のスレッドに割り当てる方法を制御することはできません。

結果を非同期コールバックキューに受信するスレッドを作成し(たとえば、BlockingCollectionを使用)、選択したスレッドで作業項目をキューからプルすることができます。これにより、結果を受け取るスレッドを制御できない場合でも、結果を処理するスレッドを制御できます。

于 2012-12-18T17:00:08.887 に答える
0

デフォルトの動作は、アプリケーションのメイン スレッドを使用している場合は現在のスレッドでコールバックし、バックグラウンド ワーカーを使用している場合は別のスレッドを使用するようです。これは、メイン スレッドからリクエストを送信するときに、Win8 ストア アプリで見始めたいくつかのバグに基づいています。

于 2013-06-29T01:00:48.657 に答える