等待UI线程后的延续 - 并发数据竞争

时间:2013-08-27 22:31:28

标签: c# asynchronous concurrency race-condition

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

在这种情况下,没有数据争用,因为await将捕获UI上下文并在该上下文中恢复async方法。您可能会发现我的async introduction post有帮助。

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