Windows Phone 计划任务中的独立存储编辑

Posted

技术标签:

【中文标题】Windows Phone 计划任务中的独立存储编辑【英文标题】:IsolatedStorage Edit in Windows Phone ScheduledTask 【发布时间】:2014-11-05 13:27:30 【问题描述】:

我正在从 IsolatedStorage 读取数据,但无法在 ScheduledTask 中对其进行编辑。我该如何编辑它?

private void StartToastTask(ScheduledTask task)
    
        long rank = 0, difference = 0;
        string text = "", nickname = "";
        PishtiWCF.PishtiWCFServiceClient ws = ServiceClass.GetPishtiWCFSvc();
        ws.GetUsersRankCompleted += (src, e) =>
        
            try
            
                if (e.Error == null)
                
                    difference = rank - e.Result.GeneralRank;
                    if (!String.IsNullOrEmpty(nickname))
                    
                        if (difference < 0)
                            text = string.Format("0, 1 kişi seni geçti!", nickname, difference.ToString(), e.Result.GeneralRank);
                        else if (difference > 0)
                            text = string.Format("0, 1 kişiyi daha geçtin!", nickname, Math.Abs(difference).ToString(), e.Result.GeneralRank);
                        else if (e.Result.GeneralRank != 1)
                            text = string.Format("0, sıralamadaki yerin değişmedi!", nickname, e.Result.GeneralRank);
                        else
                            text = string.Format("0, en büyük sensin, böyle devam!", nickname);
                    
                    else
                        return;
                    Mutex mut;
                    if (!Mutex.TryOpenExisting("IsoStorageMutex", out mut))
                        mut = new Mutex(false, "IsoStorageMutex");
                    mut.WaitOne();
                    using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication())
                    
                        using (IsolatedStorageFileStream stream = file.OpenFile("UserRanks", FileMode.Open, FileAccess.Write))
                        
                            StreamWriter writer = new StreamWriter(stream);
                            writer.Write(string.Format("0,1", nickname, e.Result.GeneralRank));
                            writer.Close();
                            stream.Close();
                        
                    
                    mut.ReleaseMutex();

                    ShellToast toast = new ShellToast();
                    toast.Title = "Pishti";
                    toast.Content = text;
                    toast.Show();
                
                FinishTask(task);
            
            catch (Exception)
            

            
        ;
        try
        
            Mutex mut;
            if (!Mutex.TryOpenExisting("IsoStorageMutex", out mut))
                mut = new Mutex(false, "IsoStorageMutex");
            mut.WaitOne();
            using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication())
            
                using (IsolatedStorageFileStream stream = file.OpenFile("UserRanks", FileMode.Open, FileAccess.Read))
                
                    using (StreamReader reader = new StreamReader(stream))
                    
                        string temp = reader.ReadToEnd();
                        if (temp.Split(',').Count() > 1)
                        
                            nickname = temp.Split(',')[0];
                            rank = long.Parse(temp.Split(',')[1]);
                            ws.GetUsersRankAsync(nickname);
                        
                        reader.Close();
                    
                    stream.Close();
                
            
            mut.ReleaseMutex();
        
        catch (Exception)
        
        

    

我从 UserRanks 文件中获取排名,例如 1200,但是当我从 WCF 获取数据时,将其编辑为 1000 并希望将其写入到 IsolatedStorage,它不会使应用程序崩溃,但它会失败。

你知道为什么吗?

谢谢。

【问题讨论】:

你的 catch 块是空的吗?我看到你解决了你的问题,但你说它不会崩溃但会失败。如果 catch 块为空,则指示从何处开始故障排除的异常被吞下。一个好的起点是将catch (Exception) 更改为catch (Exception ex) 并在下一行放置一个断点。这样,即使您打算忽略异常,当在调试过程中发生异常时,应用程序也会停止并允许您检查它。 【参考方案1】:

我已经用删除文件修复了它。

                    Mutex mut;
                    if (!Mutex.TryOpenExisting("IsoStorageMutex", out mut))
                        mut = new Mutex(false, "IsoStorageMutex");
                    mut.WaitOne();
                    using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication())
                    
                        if (file.FileExists("UserRanks"))
                            file.DeleteFile("UserRanks");
                        using (IsolatedStorageFileStream stream = file.OpenFile("UserRanks", FileMode.OpenOrCreate, FileAccess.Write))
                        
                            StreamWriter writer = new StreamWriter(stream);
                            writer.Write(string.Format("0,1", nickname, e.Result.GeneralRank));
                            writer.Close();
                            stream.Close();
                        

                    
                    mut.ReleaseMutex();

【讨论】:

【参考方案2】:

您似乎首先写入文件,这是有道理的,但是当您这样做时,您会使用文件访问模式 - FileMode.Open - 这意味着“打开现有文件”。第一次执行此操作时,文件将不存在并且打开将失败。

您应该使用不言自明的 FileMode.OpenOrCreate,或者使用 FileMode.Append,如果文件存在则打开并查找文件末尾,如果不存在则创建一个新文件。

如果您想丢弃任何预先存在的文件(这是您的删除然后创建将执行的操作),那么只需使用 FileMode.Create

【讨论】:

以上是关于Windows Phone 计划任务中的独立存储编辑的主要内容,如果未能解决你的问题,请参考以下文章

将带有 Exif 信息的图像从 Windows Phone 发送到 Java 服务器

使用 Windows 任务计划程序执行存储过程

Windows 7 Phone 文档数据库Rapid Repository正式发布

Windows phone 8.1 后台任务内存管理

在 Windows Phone 8.1 中的时间触发后从后台任务唤醒/启动主应用程序

如何找到计划任务文件夹的位置