gpt4 book ai didi

c# - WinRT : Loading static data with GetFileFromApplicationUriAsync()

转载 作者:太空狗 更新时间:2023-10-30 00:15:41 25 4
gpt4 key购买 nike

我的 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.Resulttask.Wait()await 关键字结合使用时,您会导致僵局。发生这种情况是因为在 waiting 代码在调用它的同一上下文中恢复(在您的情况下 - GUI 线程)。并且由于 GUI 线程当前正在等待任务完成(通过 ResultWait()),因此会出现死锁并且永远不会调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com