存储文件上的 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)
我正在读取一个文件,存在于通用 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)