c# - 为什么新线程可以访问UI?

标签 c# windows-runtime windows-store-apps async-await

以下面的方法为例:

private async void F()
{
    button.IsEnabled = false;
    await Task.Delay(1000);
    button.IsEnabled = true;
}

在这种情况下,任何以 await 开始的代码总是出现在另一个线程上(编辑:错误),这可能不应该访问 UI 线程,类似于桌面应用程序。在类似的情况下,我记得有一个异常(exception),例如:

The application called an interface that was marshalled for a different thread.

但是,该示例不会触发任何异常。这是预期的吗?我能可靠地编写这样的代码吗?

最佳答案

any code starting at await always occurs on another thread (non-UI thread, right?),

不,一点也不。 await 不会启动其他线程。我有一个 async intro如果您发现此声明令人困惑,这可能会有所帮助。

await做的是将方法的其余部分安排为在异步操作完成后继续运行(在这种情况下,异步操作只是一个定时器触发)。默认情况下,await 将捕获一个“上下文”,它是 SynchronizationContext.Current(或者,如果它是 null,则上下文是 TaskScheduler.Current).在这种情况下,有一个 UI SynchronizationContext 可确保 async 方法的其余部分将在 UI 线程上运行。

关于c# - 为什么新线程可以访问UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35106105/

相关文章:

c# - EF Core GetNavigations 忽略集合

c# - 扩展方法中的 HtmlAttributes

c# - 正则表达式:匹配除 X 以外的所有内容,然后匹配 X

c# - 如何使用 Windows 任务计划程序执行 .Net Core 2.0 控制台应用程序?

c# - 在 WinRT 应用程序中搜索 google

audio - 在我的 Windows 应用商店 HTML5 应用中启用背景音频

windows-runtime - 写入文件元数据 Windows 应用商店应用程序

c# - Flyout 或 Popup 以显示附加信息

c# - 创建 Windows 应用商店应用程序时出现问题。 (Windows 8)

c# - 在 .Net 后端 Azure 移动服务中使用 Microsoft 帐户对用户进行身份验证,登录后出现错误