0

我已经能够提出以下“几乎可以工作”的 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。

谢谢,胡安

4

0 回答 0