【问题标题】:IsolatedStorage Edit in Windows Phone ScheduledTaskWindows Phone 计划任务中的独立存储编辑
【发布时间】: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) 并在下一行放置一个断点。这样,即使您打算忽略异常,当在调试过程中发生异常时,应用程序也会停止并允许您检查它。

标签: windows-phone-8 scheduled-tasks mutex isolatedstorage background-task


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多