我正在读取一个文件,该文件存在于通用窗口应用程序范围中,从一个外部项目添加为.dll到第一个.代码似乎在GetFileAsync中卡住或挂起.此外,当我从应用程序而不是.dll项目运行相同的存根时,它可以工作.我需要知道是否有一种不同的方法从.dll项目中读取Application文件夹中的文件,以便在同一个项目中使用.读取文件的代码:
private static async TaskgetStreamAsync() { 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(); }
Greg D.. 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()
你自己的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()