等待UI线程后的继续-并发数据竞赛

本文关键字:并发 数据 竞赛 继续 UI 线程 等待 | 更新日期: 2023-09-27 18:29:11

想象一下,我有一个按钮点击事件处理程序,比如:

public async void btn_Click(...)
{
    await longRunningOperationAsync();
    x += 2;
}
public async void btn2_Click(...)
{
   await longRunningOperationAsync();
   x += 3;
}

如果用户点击btn,然后立即点击btn2,是否会导致数据竞赛?等待之后的语句将在单线程(UI)中同时执行(例如抢占),对吗?

然而,我在该网站上读到:"你所有的代码都在UI线程中运行,所以你没有UI更新的问题。此外,你的代码都没有并发运行,这消除了通常与并发相关的数据完整性问题(死锁、争用条件)。"http://www.techrepublic.com/blog/software-engineer/why-net-developers-should-check-out-the-await-system/

我基本上不明白发生了什么。

等待UI线程后的继续-并发数据竞赛

在这种情况下,不存在数据竞争,因为await将捕获UI上下文并在该上下文中恢复async方法。你可能会发现我的async介绍帖子很有帮助。

不能保证它们恢复的顺序,但从抢占的意义上讲,它们不是并发的。在UI上下文中,可以将async方法视为拆分为几个块(在每个await处)。每个区块将一次执行一个,并且不能被另一个区块抢占。