我有一个按钮,它有一个async
处理程序,该处理程序调用了一个异步方法并使用了await
关键字。下面是代码示例:
private async void Button1_OnClick(object sender, RoutedEventArgs e)
{
await IpChangedReactor.UpdateIps();
}
下面是 IpChangedReactor.UpdateIps()
的样子:
public async Task UpdateIps()
{
await UpdateCurrentIp();
await UpdateUserIps();
}
它是异步的全部。现在我有一个DispatcherTimer,在其tick事件中重复调用await IpChangedReactor.UpdateIps。假设我点击了按钮。现在,事件处理程序在UpdateIps上等待并返回到调用方,这意味着WPF将继续执行其他操作。同时,如果计时器触发,则会再次调用UpdateIps,现在两个方法都将同时运行。所以我认为它类似于使用2个线程。可能会发生竞争条件吗?(我的一部分说不会,因为它们都在同一个线程中运行。但这很令人困惑)
我知道异步方法不一定在单独的线程上运行。然而,在这种情况下,它非常令人困惑。
如果我在这里使用同步方法,它将按预期工作。计时器tick事件将仅在第一次调用完成后运行。
有人能给我启示吗?