- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的 Windows 8 应用程序中有一些数据应该随附,并且只是一些静态数据。事实上:这是一个应该反序列化的简单 xml 文件。
数据保存在 Assets\data.xml 中(Assets 是空白应用程序模板中的默认文件夹)。
我正在使用这段代码来访问它:
private static async Task<MyObject> Load()
{
if (Windows.ApplicationModel.DesignMode.DesignModeEnabled)
{
return new SampleData();
}
var uri = new Uri("ms-appx:///Assets/data.xml");
Debug.WriteLine("Getting file from Application");
var file = await StorageFile.GetFileFromApplicationUriAsync(uri);
Debug.WriteLine("Opening file for reading async");
var stream = await file.OpenStreamForReadAsync();
var serializer = new XmlSerializer(typeof(MyObject));
Debug.WriteLine("Begin deserialization");
var result = (MyObject)serializer.Deserialize(stream.AsInputStream().AsStreamForRead());
return result;
}
调用方法:
public static MyObject GetMyObject()
{
if (_myObject == null)
{
_myObject = Load().Result;
}
return _myObject;
}
“有趣”的部分是:
如果我在 var uri = new Uri(...);
处设置断点并使用 F11 单步执行代码,一切都会按预期进行。我得到了所有调试行,我的应用程序显示了所需的静态数据。
如果我不设置断点并且不跳过这段代码,我只会得到 Getting a file from Application
的 Debug 输出,而不会发生任何其他事情。 GetFileFromApplicationUriAsync()
似乎永远不会回来。我等了五分多钟,还是没有任何反应。
有人知道吗?
最佳答案
感谢您发布代码。请尝试按以下方式更改您的方法 Load
:
//your code
var file = await StorageFile.GetFileFromApplicationUriAsync(uri).AsTask().ConfigureAwait(false);
//your code
var stream = await file.OpenStreamForReadAsync().ConfigureAwait(false);
//your code
这里的主要区别是AsTask().ConfigureAwait(false)
编辑:
很高兴听到它正在运行。解释很简单:当您在 GUI 线程上将 task.Result
或 task.Wait()
与 await
关键字结合使用时,您会导致僵局。发生这种情况是因为在 waiting
代码在调用它的同一上下文中恢复(在您的情况下 - GUI 线程)。并且由于 GUI 线程当前正在等待任务完成(通过 Result
或 Wait()
),因此会出现死锁并且永远不会调用 await
关键字之后的代码. ConfigureAwait(false)
指定可以忽略当前上下文,从而允许您的代码成功完成。此处有更多详细信息:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
关于c# - WinRT : Loading static data with GetFileFromApplicationUriAsync(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12235085/
我的 Windows 8 应用程序中有一些数据应该随附,并且只是一些静态数据。事实上:这是一个应该反序列化的简单 xml 文件。 数据保存在 Assets\data.xml 中(Assets 是空白应
我尝试使用以下方法,但它们在 Uno (Android) 中都显示为未实现。我能做什么? 是否有任何 Xamarin.Essentials 替代品? 或其他NuGet 包? 或者我应该在每个平台上使用
我是一名优秀的程序员,十分优秀!