如何使用带有 WinUI3 控件和异步代码的 C#/WinRT 组件,以及如何从使用 Windows 应用 SDK 的 C++/WinRT 应用中使用它?

How do I consume a C#/WinRT component with WinUI3 controls and async code and consume it from a C++/WinRT app that uses the Windows App SDK?

提问人:Biff MaGriff 提问时间:11/17/2023 更新时间:11/20/2023 访问量:87

问:

我正在尝试升级现有的 C# UWP,我必须由 WinUI3 C++ 和 WinUI3 C# 使用。UserControl

太棒了,我正在使用共享代码项目为 UWP 和 WinUI3 编译它,一切都很棒,除了我似乎无法在我的 WinUI C++ 测试应用程序中执行异步代码。它只是死了,我什至无法将其包裹在尝试/捕获中。

我决定将我的问题简化为基础知识,并按照 Microsoft 的本教程进行操作,一切都很好,直到我将按钮单击事件更改为

private async void Button_Click(object sender, RoutedEventArgs e)
{
    await Task.Delay(5000);
}

WinUI3 C++ 一旦命中异步行,它就会死掉

CppApp.exe 中0x75F39132 (KernelBase.dll) 处未处理的异常:0xE0434352(参数:0x8001010E、0x00000000、0x00000000、0x00000000、0x5D850000)。

我尝试的任何事情,喜欢或似乎不起作用。Wait()GetAwaiter().GetResult()GetAsyncAction()

引用同一项目的 WinUI3 C# 应用没有问题。 我觉得我在这里错过了一些基本的东西。

如何在 C# 中编写异步代码以在 C++ 中使用?

C# C++ Windows运行时 WinUI-3

评论

0赞 Jeaninez - MSFT 11/20/2023
我建议您可以按照文档:C++/WinRT 的并发和异步操作进行操作

答:

0赞 Biff MaGriff 11/20/2023 #1

我无法弄清楚如何在 C++ 中运行异步 C#,所以我编译了另一个特定于 C++ 的 DLL,它删除了异步。

例如。

Task.Run(async () => await Task.Delay(5000)).Wait();