当前位置: 首页 > 编程语言 > C#

WinRT:使用GetFileFromApplicationUriAsync()加载静态数据分享

时间:2023-04-10 16:32:08 C#

C#学习教程:WinRT:使用GetFileFromApplicationUriAsync()加载静态数据实际上:这是一个简单的xml文件,应该反序列化。数据保存在Assetsdata.xml中(Assets是BlankAppTemplate中的默认文件夹)。我正在使用此代码来访问它:privatestaticasyncTaskLoad(){if(Windows.ApplicationModel.DesignMode.DesignModeEnabled){returnnewSampleData();}varuri=newUri("ms-appx:///Assets/data.xml");Debug.WriteLine("从应用程序获取文件");varfile=awaitStorageFile.GetFileFromApplicationUriAsync(uri);Debug.WriteLine("打开异步读取文件");varstream=等待文件。OpenStreamForReadAsync();varserializer=newXmlSerializer(typeof(MyObject));Debug.WriteLine("开始反序列化");var结果=(MyObject)序列化器。反序列化(流。AsInputStream()。AsStreamForRead());返回结果;}调用:publicstaticMyObjectGetMyObject(){if(_myObject==null){_myObject=Load().Result;}返回_myObject;关于这个的“有趣”部分是:如果我在varuri=newUri(...);中这样做设置断点varuri=newUri(...);并使用F11逐步执行代码,一切都按预期进行。我得到了所有调试行,我的应用程序显示了所需的静态数据。如果我不设置断点并且不跳过这段代码,我只会得到从应用程序获取文件的调试输出,没有其他任何事情发生。似乎GetFileFromApplicationUriAsync()永远不会返回。我等了五分多钟,还是没有任何反应。有人有什么想法吗?感谢您发布代码。请尝试按如下方式更改您的加载方法://您的代码varfile=awaitStorageFile.GetFileFromApplicationUriAsync(uri).AsTask().ConfigureAwait(false);//你的代码varstream=awaitfile.OpenStreamForReadAsync().ConfigureAwait(false);//你的代码这里的主要区别是AsTask()。ConfigureAwait(false)编辑:很高兴听到它起作用了。解释很简单:当您在GUI线程上结合await关键字使用task.Result或task.Wait()时,会导致死锁。发生这种情况是因为等待代码在相同的上下文中恢复(在您的情况下是GUI线程)。并且因为当前等待任务完成的GUI线程(通过Result或Wait())死锁并且永远不会调用await关键字之后的代码。ConfigureAwait(false)指定可以忽略当前上下文,从而使您的代码成功完成。更多信息请访问:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html以上就是C#学习教程:WinRT:使用GetFileFromApplicationUriAsync()加载静态资料分享如果内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: