0

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

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/

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

4

1 回答 1

1

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

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

于 2013-08-27T22:33:27.120 回答