存储文件上的 OpenReadAsync 调用挂起

OpenReadAsync call on storagefile hangs

我正在读取一个文件,存在于通用 windows 应用程序范围内,来自作为 .dll 添加到第一个项目的外部项目。代码似乎卡在或挂在 GetFileAsync 处。 此外,当我 运行 来自应用程序而不是 .dll 项目的相同存根时,它可以工作。 我需要知道是否有不同的方式从 .dll 项目读取应用程序文件夹中的文件,以用于同一项目。 读取文件的代码:

private static async Task<Stream> getStreamAsync()
{
    try
    {
        StorageFolder storageFolder = Package.Current.InstalledLocation;
        StorageFile file = await storageFolder.GetFileAsync("file.json");
        Stream stream = null;
        if (file != null)
        {
            var randomAccessStream = await file.OpenReadAsync().AsTask().ConfigureAwait(false);
            stream = randomAccessStream.AsStreamForRead();
        }

        return stream;
    }
    catch (Exception ex)
    { }
}

private Stream fetchStream()
{
    var stream = getStreamAsync().Result;
    return stream;
}

private func()
{
    Stream StreamFetched = fetchStream();
}

您正在使您的 UI 线程与自身陷入僵局:

fetchStream 呼叫 getStreamAsync()getStreamAsync() 在 storageFolder.GetFileAsync 等待,将继续调度到当前同步上下文(UI 线程的消息队列)。 UI 线程立即从 getStreamAsync() returns 并继续执行 fetchStream()。 执行 .Result 阻塞 UI 线程等待继续完成。

...但是

延续永远不会完成,因为延续被安排到 运行 稍后在 UI 线程上并且 UI 线程被阻塞。

试试这样的:

StorageFile file = await storageFolder.GetFileAsync("file.json").ConfigureAwait(false);

这将导致根据默认同步上下文而不是当前同步上下文安排延续。这(大概)就是为什么您在 OpenReadAsync()

的下方还有一个 ConfigureAwait(false)