首页 > 解决方案 > 使用异步回调了解 Dispatcher.RunAsync 并等待 UI 相关任务

问题描述

我将 C# + UWP 用于常规桌面应用程序并创建兼容的统一版本。我使用了几个 API 调用,例如必须从 STA 线程使用的 MediaCapture.InitializeAsync。

下面的代码适用于桌面应用程序:

var ignored = Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
{
    Debug.WriteLine("Step 1 " + Dispatcher.HasThreadAccess);
    //access STA API calls here
    await Task.Delay(1000);
    Debug.WriteLine("Step 2 " + Dispatcher.HasThreadAccess);
    //access STA API calls here
});

它将打印“Step 1 True”,一秒后打印“Step 2 True”。我认为这意味着它们都在 UI 线程中运行并且我可以访问与 UI 相关的 API 调用?

到目前为止,这一直很好,直到我通过 Unity 触发了上述方法。它将打印“Step 1 True”,一秒后打印“Step 2 False”。所以它出现在等待调用之后我不再在 UI 线程上。

这里到底发生了什么?

标签: c#unity3duwp

解决方案


你在使用一些古老版本的 Unity 吗?这曾经是一个已知问题,但他们在几年前修复了它:

https://issuetracker.unity3d.com/issues/uwp-messagedialog-class-causes-crash-on-il2cpp-backend


推荐阅读