我已经能够提出以下“几乎有效”的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。
谢谢, 胡安