0

在我的 WinUI3(C++/WinRT) 应用程序中,我有一个 Win2D CanvasControl,我想在其中绘制图像。它在画布初始化时使用CanvasBitmap::LoadAsync()加载。我很难使用 C++ 协程让它工作。

相关代码如下。

// MainWindow.xaml
<Window>
  <Grid>
    <canvas:CanvasControl x:Name="mainCanvas"Draw="mainCanvas_Draw" CreateResources="mainCanvas_CreateResources"/>
  </Grid>
</Window>
// MainWindow.xaml.cpp
MainWindow::MainWindow()
{
    InitializeComponent();

    // Sprite is a custom class and pSprite is a unique_ptr in the MainWindow class
    pSprite = std::make_unique<Sprite>(float2{ 300.0f, 300.0f }, 50.0f, 60.0f);
}

void MainWindow::mainCanvas_Draw(const CanvasControl& sender, const CanvasDrawEventArgs& args)
{
    pSprite->Update();
    pSprite->Draw(args, spriteBitmap);
}

void MainWindow::mainCanvas_CreateResources(CanvasControl const& sender, winrt::Microsoft::Graphics::Canvas::UI::CanvasCreateResourcesEventArgs const& args)
{
    args.TrackAsyncAction(CreateResourcesAsync(sender));
}

IAsyncAction MainWindow::CreateResourcesAsync(CanvasControl const& sender)
{
    // spriteBitmap is a member variable of MainWindow class
    spriteBitmap = co_await CanvasBitmap::LoadAsync(sender, Uri(L"ms-appx:///Assets/sprite.png"));
}

当我使用上面的代码运行应用程序时,会引发异常并且消息是“应用程序调用了为不同线程编组的接口。”。

非常感谢有关如何在 WinUI (C++/WinRT) 中处理异步操作的指导!

4

1 回答 1

0

在 CreateResourcesAsync 中按值传递发件人

IAsyncAction MainWindow::CreateResourcesAsync(CanvasControl const sender)

因为 mainCanvas_CreateResources() 不等待 CreateResourcesAsync() 完成,然后在 mainCanvas_CreateResources() 退出后,原来的“sender”就会被销毁,因此在 CreateResourcesAsync() 中不能引用原来的“sender”。

于 2021-10-08T03:39:53.490 回答