异步方法获胜';调用时不会返回

本文关键字:返回 调用 获胜 异步方法 | 更新日期: 2023-09-27 18:24:57

我在这方面遇到了麻烦。我正在尝试制作一个异步方法,将本地文件的内容作为字符串返回。这是我的方法:

private static async Task<string> ReadContentsAsString(string fileName)
{
    var uri = new Uri(string.Format(@"ms-appx:///{0}", fileName));
    var file = await StorageFile.GetFileFromApplicationUriAsync(uri).AsTask().ConfigureAwait(false);
    var stream = await file.OpenStreamForReadAsync().ConfigureAwait(false);
    using (var streamReader = new StreamReader(stream))
    {                
        return await streamReader.ReadToEndAsync();
    }
 }

不幸的是,在执行到我的方法结束后,应用程序将永远等待。它完全挂着。它是在一开始就被调用的,当时启动屏幕仍然显示(Windows Phone 8.1)

我想念什么?

异步方法获胜';调用时不会返回

我怀疑在调用堆栈的更上层,您的代码会调用Task.WaitTask<T>.Result。这可能会导致我在博客中描述的死锁。

总之,当await用于任务时,默认情况下它将捕获当前"上下文",并使用该上下文来恢复async方法。在这种情况下,上下文是与单个UI线程关联的UI上下文。如果调用堆栈上的代码正在调用WaitResult,那么它会阻塞UI线程,从而阻止async方法完成。

您的方法正在正常工作。我怀疑您在调试时遇到了这个问题。

我也注意到(有时)在调试asyc方法时有这样的行为(这里有一个问题的链接)-程序从不从该方法返回,只是挂起-我不知道确切的原因。要测试它,只需尝试像这样运行您的方法-例如,点击按钮:

private async void firstBtn_Click(object sender, RoutedEventArgs e)
{
    Debug.WriteLine("Before method");
    string readValue = await ReadContentsAsString("TextFile1.txt");
    Debug.WriteLine(string.Format("Read value: {0}", readValue));
}

正如我在设备上测试的那样,它应该可以工作,但如果我在方法中设置了断点,它就会挂起。