我在 ppltasks.h 的 _ContextCallback 中有一个第一次机会例外,我只是不明白。
我的项目是一个混合 WinRT/本机应用程序。该应用程序由多个子项目组成,其中一个使用 WinRT。WinRT 代码位于与主线程不同的线程中运行的静态库中(我无权更改它)。WinRT 代码是从 Visual Studio 2012 RC 中生成的 Direct3D Metro 应用程序复制而来的。
该代码尝试加载一个简单的着色器:
void CubeRenderer::CreateDeviceResources()
{
Direct3DBase::CreateDeviceResources();
// going to crash while attempting to load a file.
auto loadVSTask = DX::ReadDataAsync("SimpleVertexShader.cso");
该文件存在于正确的位置,并且被证明可以工作。
代码在这里崩溃。_M_context._M_pContextCallback 无效。
void _Reset()
{
if (_M_context._M_captureMethod != _S_captureDeferred && _M_context._M_pContextCallback != nullptr)
{
_M_context._M_pContextCallback->Release();
}
}
输出窗口给出:MyApplication.exe 中 0x00E34C89 处的第一次机会异常:0xC0000005:访问冲突读取位置 0xCDCCDCD。
堆栈跟踪如下所示:
MyApplication.exe!Concurrency::details::_ContextCallback::_Reset() 第 620 行 C++ MyApplication.exe!Concurrency::details::_ContextCallback::operator=(const Concurrency::details::_ContextCallback & _Src) 第 563 行 C++ MyApplication .exe!Concurrency::task_continuation_context::operator=(const Concurrency::task_continuation_context & __that) C++ MyApplication.exe!Concurrency::task::_ContinuationTaskHandle,std::integral_constant,Concurrency::details::_TypeSelectorAsyncOperation>::_ContinuationTaskHandle, std::integral_constant,Concurrency::details::_TypeSelectorAsyncOperation>(const std::shared_ptr > & _AncestorImpl, const std::shared_ptr > & ContinuationImpl, const DX::ReadDataAsync::_l3:: & _Func, const Concurrency::task_continuation_context & _Context, Concurrency::details::_TaskInliningMode _InliningMode) 第 3292 行 C++ MyApplication.exe!Concurrency::task:: ThenImpl >(const DX::ReadDataAsync:: _l3:: & _Func, Concurrency::details::_CancellationTokenState * _PTokenState, const Concurrency::task_continuation_context & _ContinuationContext, bool _Aggregating, Concurrency::details::_TaskInliningMode InliningMode ) 第 3584 行 C++ MyApplication.exe!Concurrency::task::then< >(const DX::ReadDataAsync:: _l3:: & _Func) 第 2882 行 C++ MyApplication.exe!DX::ReadDataAsync(Platform::String ^ 文件名) 第 42 行 C++ MyApplication.exe!CubeRenderer::[Direct3DBase]::CreateDeviceResources() 行30 C++
所以 _ContextCallback 有问题,这就是我卡住的地方。
- 这个上下文回调是什么?它似乎与从一个任务传递到另一个任务有关。
- 如果它是无效的,那怎么会发生呢?
- 如果只是没有正确设置,我该如何正确设置?
我可以让它工作,但它涉及更改应用程序中的所有子项目以使用 WinRT。不幸的是,这不是一个可接受的解决方案,因为其他子项目中的代码也在我的控制之外。我也想尝试了解这里实际发生了什么。
有什么见解或想法吗?谢谢!