gpt4 book ai didi

c# - 对调度程序和异步感到困惑

转载 作者:太空狗 更新时间:2023-10-30 00:31:42 25 4
gpt4 key购买 nike

我正在制作一个 Windows 8.1 平板电脑应用程序,并且大量使用 async 关键字。我对 async 关键字的理解是,虽然它对程序员来说似乎是同步的,但不能保证您在 await 完成时会在同一线程上运行。

在我的代码隐藏文件中,我使用 Dispatcher 在 UI 线程上运行任何 UI 更新。我发现的每个示例都表明在使用“回调”类型的场景时这是一个很好的做法,但在使用异步时我没有看到它被提及。根据我对异步的理解,似乎只要我想在任何 await 调用后更新 UI,我就需要使用调度程序。

我试图通过将我的理解写在下面的代码中来让自己更清楚。

private void SomeEventHandler(object sender, RoutedEventArgs e)
{
UpdateUI(); //This should run in my UI thread
await Foo(); //When Foo returns I have no guarantee that I am in the same thread
UpdateUI(); //This could potentially give me an error
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
UpdateUI(); //This will run in the UI thread
});
}

我只需要访问 UIContext 而线程无关紧要吗?如果有人能为我澄清这一点,那就太好了。

最佳答案

My understanding of the async keyword is that, while it appears to be synchronous to the programmer, there is no guarantee that you will be running on the same thread when your await finishes.

不完全是...如果启动异步操作的线程有一个同步上下文(对于 UI 线程来说是这样),执行将始终在同一个线程上恢复,除非您明确指定不捕获同步上下文.ConfigureAwait(false).

如果没有同步上下文,或者如果它没有被捕获,那么执行将在 ThreadPool 线程上恢复(除非等待的任务实际上同步完成,在这种情况下你留在同一个线程)。

因此,这是带有更新注释的代码片段:

private void SomeEventHandler(object sender, RoutedEventArgs e)
{
UpdateUI(); //This should run in my UI thread
await Foo(); //When Foo returns I am still in the UI thread
UpdateUI(); //This will work fine, as I'm still in the UI thread

// This is useless, since I'm already in the UI thread ;-)
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
UpdateUI(); //This will run in the UI thread
});
}

关于c# - 对调度程序和异步感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23770848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com