存储文件上的OpenReadAsync调用挂起

时间:2016-01-06 06:43:30

标签: c# async-await win-universal-app uwp

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

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();
}

1 个答案:

答案 0 :(得分:5)

你的UI线程自身陷入僵局:

fetchStream来电getStreamAsync()getStreamAsync()等待storageFolder.GetFileAsync,将连续调度安排到当前同步上下文(UI线程的消息队列)。 UI线程立即从getStreamAsync()返回并继续执行fetchStream()。 执行.Result会阻止UI线程等待继续完成。

......但是

延续将永远不会完成,因为延迟计划稍后在UI线程上运行并且UI线程被阻止。

尝试类似:

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

这将导致继续根据默认同步上下文而不是当前上下文进行调度。这(大概)是为什么ConfigureAwait(false)

还有OpenReadAsync()的原因