首页 > 解决方案 > 似乎 UWP Async IO 仅在 10.0.17763 之后才是真正的异步操作,但在此之前不是真正的。怎么解释?

问题描述

只需在下面写下这个简单的代码MainPage

private void Button_Click(object sender, RoutedEventArgs e)
{
    // It is not recommended to call Wait() in a UI thread. I write this only for a test.
    DoAsync().Wait();
    // This line enters on 10.0.17134 / 10.0.16299
    // and never enters on 10.0.17763.
}

private async Task DoAsync()
{
    await ApplicationData.Current.LocalFolder.CreateFileAsync("walterlv", CreationCollisionOption.ReplaceExisting);
}

以 10.0.17134 或更低版本为目标

通常,如果DoAsync是真正的异步操作,Wait()则会导致死锁。但是如果你运行Button_Click,你会发现死锁并没有发生。

尝试多次单击按钮,您会看到在随机点击计数后发生死锁。

我也试过 10.0.116299。

针对 10.0.17763

单击按钮时会立即发生死锁。

我的困惑

10.0.17134 以上或以下的异步操作有什么区别?

注意:不建议在 UI 线程中调用Wait()or Result,但是我对它们之间的不同行为感到困惑,所以我已经编写了上面的测试代码。

标签: uwpasync-awaitdeadlockwindows-10-universal

解决方案


推荐阅读