2012-12-18 124 views
0

我正在使用IXMLHTTPRequest2/IXMLHTTPRequest2Callback接口发送HTTP请求并处理响应。有时,响应回调(OnHeadersAvailable()等)在与发送请求的线程不同的线程上调用,有时在发送请求的同一个线程上调用回调,如下面的调用堆栈所示:如何确保在另一个线程上调用IXMLHTTPRequest2回调?

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++ 

我希望回调总是在不同的线程上调用,因为这被记录为异步接口。有没有一种方法可以保证回调将始终在与发送请求的线程不同的线程上调用?感谢您的任何信息。

回答

0

“异步”仅表示在结果可用于处理之前,它不会消耗线程池中的线程。

编写自己的池管理器不足,无法控制如何将异步请求的结果分配给给定的线程。

您可以让线程接收异步回调队列的结果(例如,使用BlockingCollection)并让您选择的线程将工作项目从队列中拉出。这样,即使无法控制哪个线程接收结果,您也可以控制哪个线程处理结果。

+0

非常感谢。对于那些感兴趣的人,我在这里找到了异步与线程的很好的解释[异步与线程](http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/fa9e1830-ef06-4dd1- 8ef7-59ebf04ab1e6 /) –

0

看来,如果您在应用程序主线程上,默认行为是回调当前线程,并且如果您在后台工作者上,则使用其他线程。这是基于我在从主线程发送请求时开始在Win8商店应用程序中看到的一些错误。

相关问题