Man*_*ber 4 c# asynchronous windows-8 windows-runtime winrt-xaml
我的Windows 8应用程序中有一些数据应该随附,并且只是一些静态数据.实际上:它是一个简单的xml文件,应该反序列化.
数据保存在Assets\data.xml中(资产是空白应用程序模板中的默认文件夹).
我正在使用这段代码来访问它:
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;
}
Run Code Online (Sandbox Code Playgroud)
通话方式:
public static MyObject GetMyObject()
{
if (_myObject == null)
{
_myObject = Load().Result;
}
return _myObject;
}
Run Code Online (Sandbox Code Playgroud)
关于这个的"有趣"部分是:
如果我设置一个断点var uri = new Uri(...);并使用F11来逐步执行代码,一切都按预期工作.我得到了所有的调试行,我的应用程序显示了所需的静态数据.
如果我没有设置断点并且没有跨过这段代码,我只得到Debug输出,Getting a file from Application并且不会发生任何其他事情.似乎GetFileFromApplicationUriAsync()永远不会回来.我等了五分多钟,但仍然没有发生任何事情.
有人有任何想法吗?
Ale*_*der 11
感谢您发布代码.请尝试更改您的方法Load,如下所示:
//your code
var file = await StorageFile.GetFileFromApplicationUriAsync(uri).AsTask().ConfigureAwait(false);
//your code
var stream = await file.OpenStreamForReadAsync().ConfigureAwait(false);
//your code
Run Code Online (Sandbox Code Playgroud)
这里的主要区别是AsTask().ConfigureAwait(false)
编辑:
很高兴听到它的工作.解释很简单:当你使用task.Result或task.Wait()在GUI线程上结合await关键字时,你会导致死锁.发生这种情况是因为在awaiting调用相同的上下文后恢复代码(在您的情况下 - GUI线程).并且因为当前正在等待任务完成(通过Result或Wait())死锁的GUI线程出现,并且await永远不会调用关键字后面的代码.ConfigureAwait(false)指定可以忽略当前上下文,从而允许您的代码成功完成.有关详细信息,请访问:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
| 归档时间: |
|
| 查看次数: |
8612 次 |
| 最近记录: |