我已经能够提出以下“几乎可以工作”的 C++/winRT 代码。我使用返回 IAsyncOperation 的方法创建了一个类,以便我可以使用 co_await 关键字;该方法如下所示:
IAsyncOperation<StorageFile> FileDialogs::chooseFileToOpen() const
{
FileOpenPicker picker{};
picker.ViewMode(PickerViewMode::Thumbnail);
picker.SuggestedStartLocation(PickerLocationId::DocumentsLibrary);
picker.FileTypeFilter().Append(L".jpg");
picker.FileTypeFilter().Append(L".png");
StorageFile file = co_await picker.PickSingleFileAsync();
co_return file;
}
现在我从按钮的单击处理程序中调用此方法:
void MainPage::btnUpdateSource_Click(IInspectable const & sender,
RoutedEventArgs const & args)
{
FileDialogs fd{};
auto res = fd.chooseFileToOpen();
StorageFile file = res.get();
auto name = file.Name();
///.....
}
这可以编译,但是当 get() 方法被调用时,它会触发这个断言:
WINRT_ASSERT(!is_sta());
所以它抱怨公寓是单线程的!然而 winrt::init_apartment() 是用多线程调用的!
所以这就是我卡住的地方!
谁能给我一些见解?我正在使用 Visual Studio 2017 版本 15.7.5。
谢谢,胡安