asynchronous - Windows Phone 8 卡在 GetFolderAsync 和 OpenStreamForReadAsync 上

标签 asynchronous windows-phone-8 io

我正在制作一个 Windows Phone 8 应用程序。该应用程序的一部分需要保存状态。我将其保存为 Json 字符串。如果我打开应用程序,保存一些数据,退出应用程序并再次加载它,它会卡在 GetFolderAsync 或 OpenStreamForReadAsync 上。它不会每次都会发生,但一旦它开始挂起,我就必须杀死整个模拟器并创建一个新模拟器才能再次启动应用程序。

我什至尝试过创建一个没有数据的空文件,但问题仍然存在。

下面是我用来保存和加载数据的代码。我在哪里调用数据加载并不重要,无论是在应用程序启动时还是在表单加载时,它仍然会中断。

    private async Task SaveLists()
    {
        //XmlSerializer serializer = new XmlSerializer(typeof(ListHolder));

        // Get the local folder.
        StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;

        // Create a new folder name DataFolder.
        var dataFolder = await local.CreateFolderAsync("DataFolder",
            CreationCollisionOption.OpenIfExists);

        // Create a new file named DataFile.txt.
        var file = await dataFolder.CreateFileAsync("Lists.json",
        CreationCollisionOption.ReplaceExisting);

        string json = JsonConvert.SerializeObject(Lists, Formatting.Indented);
        byte[] fileBytes = System.Text.Encoding.UTF8.GetBytes(json.ToCharArray());

        using (var s = await file.OpenStreamForWriteAsync())
        {
            s.Write(fileBytes, 0, fileBytes.Length);

        }
    }



    private async Task LoadLists()
    {


        // Get the local folder.
        StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;

        if (local != null)
        {
            try
            {
                // Get the DataFolder folder.

                var dataFolder = await local.GetFolderAsync("DataFolder");

                // Get the file.
                var files = dataFolder.GetFilesAsync();
                var file = await dataFolder.OpenStreamForReadAsync("Lists.json");

                string jsonString = "";
                // Read the data.
                using (StreamReader streamReader = new StreamReader(file))
                {
                    jsonString = streamReader.ReadToEnd();
                }
                if (jsonString.Length > 0)
                {
                    Lists = JsonConvert.DeserializeObject<List<ItemList>>(jsonString);
                }    
                else
                {
                    Lists = new List<ItemList>();
                }                
            }
            catch (Exception ex)
            {
                Lists = new List<ItemList>();
            }

        }
    }

最佳答案

您通过调用 Result 导致了死锁。我解释一下这个僵局on my blogin a recent MSDN article 。总之,await 将(默认情况下)尝试在上下文(当前 SynchronizationContext)内恢复执行,除非它为 null,在这种情况下使用当前的TaskScheduler)。

在您的情况下,当前的 SynchronizationContext 是 UI 上下文,仅由 UI 线程使用。因此,当您通过调用 Result 来阻止 UI 线程时,async 方法无法调度回 UI 线程来完成。

关于asynchronous - Windows Phone 8 卡在 GetFolderAsync 和 OpenStreamForReadAsync 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17000434/

相关文章:

php - 使 curl_multi 'sleep' 或等待发送下一个请求

c# - 在代码中动态设置控件的 StaticResource 样式

c# - 使用 Phone Accent Brush 时按 Windows Phone 按钮不按任何按钮

linux - 调整顺序磁盘读取以提高性能

io - 如何从 Rust 中的文件中读取结构?

javascript - 异步 JSON 字符串加载 JavaScript

javascript - 在异步函数外部使用await

vb.net - 在 vb.net 控制台 exe 中获取启动路径

node.js 多个http请求

c# - JSON反序列化为动态后无法访问属性