uwp - 循环中 OpenReadAsync 后 StorageFile 的 IVectorView 变为空(可能是 winrt 错误)
问题描述
我正在 BlankApp 项目模板中创建一个运行时类,该类打开IVectorView<StorageFile>
它通过引用作为参数接收的一个。然后它循环遍历向量以便从文件中读取。但是,当我在调用读取后尝试使用向量时,它会引发读取访问冲突。
我认为这是一个错误的原因是因为它只发生在我使用 BlankApp 项目的 x64 配置进行编译时。在 x86 中,不会引发异常。
这很容易重现,所以如果其他人可以确认这是否发生在他们身上,那就太好了。
//test_class.idl
[bindable]
[default_interface]
runtimeclass test_class
{
test_class();
Windows.Foundation.IAsyncAction read_files(Windows.Foundation.Collections.IVectorView<Windows.Storage.StorageFile> files);
}
//test_class.cpp
Windows::Foundation::IAsyncAction test_class::read_files(Windows::Foundation::Collections::IVectorView<Windows::Storage::StorageFile> const& files)
{
for (auto& file : files)
{
auto res = files;
auto stream = co_await file.OpenReadAsync();
auto res2 = files; // read access violation. this->**m_ptr** was 0xFFFFFFFFFFFFFFFF.
}
co_return;
}
//MainPage.cpp
Windows::Foundation::IAsyncAction MainPage::onclick_button(Windows::Foundation::IInspectable const & sender, Windows::UI::Xaml::RoutedEventArgs const & args)
{
BlankApp1::test_class m_test_class = winrt::make<BlankApp1::implementation::test_class>();
Windows::Storage::Pickers::FileOpenPicker picker;
picker.FileTypeFilter().Append(L".bmp");
Windows::Foundation::Collections::IVectorView<Windows::Storage::StorageFile> files = co_await picker.PickMultipleFilesAsync();
co_await m_test_class.read_files(files);
}
解决方案
发生这种情况是因为您通过引用异步方法来传递 arg。在 期间co_await
,调用函数 ( onclick_button
) 可能已经清理了您的引用所指的对象,基本上导致了一个悬空引用。为避免这种情况,您的协程应该按值接受参数,而不是按引用。
有关详细信息,请参阅以下部分: https ://docs.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/concurrency#parameter-passing
推荐阅读
- javascript - 寻找忽略/删除 if 命令的方法
- python - 考虑一个涉及以特征向量和数字标签为特征的数据点的 ML 应用程序?
- swift - 在警报控制器标题文本上设置倒数计时器
- mapping - 如何仅提取映射读取?
- amazon-web-services - 当路由 53 未维护 A 记录时,路由 53 dns 查询不起作用
- firebase - 类型“typeof firestore”没有调用签名 nativescript 7 @nativescript/firebase 插件
- python - tkinter - 滚动时的大量延迟/滞后
- reactjs - React 2d 随机放置的组件数组不同步
- python - Python 字典用户名和密码
- python - 你能根据变量在python中命名一只乌龟吗?