我正在读取一个文件,该文件存在于通用窗口应用程序范围中,从一个外部项目添加为.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();
}
答案 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()
的原因