想象一下,我有一个按钮点击事件处理程序,如:
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/
我基本上不明白会发生什么。
答案 0 :(得分:1)
在这种情况下,没有数据争用,因为await
将捕获UI上下文并在该上下文中恢复async
方法。您可能会发现我的async
introduction post有帮助。
他们恢复的顺序并不能保证,但在抢占意义上并不是并发的。在UI上下文中,您可以将async
方法视为拆分为多个块(每个await
)。每个块将一次执行一个,并且不能被另一个块抢占。