以下面的方法为例:
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/