C# 在Universal 8.1应用程序C的WindowsPhone 8.1中保存StringToLocalFile#

C# 在Universal 8.1应用程序C的WindowsPhone 8.1中保存StringToLocalFile#,c#,windows-phone-8.1,win-universal-app,local-files,C#,Windows Phone 8.1,Win Universal App,Local Files,我有这个功能: public async static Task<JsonObject> GetObject(string api) { try { JsonObject jsonObject = new JsonObject(); if (!IsInternetConnected()) {

我有这个功能:

   public async static Task<JsonObject> GetObject(string api)
        {
            try
            {

                JsonObject jsonObject = new JsonObject();
                if (!IsInternetConnected())
                {
                    string x = await DataBase.readStringFromLocalFile(api + ".txt");
                    jsonObject = JsonObject.Parse(x);
                }
                else
                {
                    string x = "";
                    XDocument doc = XDocument.Load("DataLibrary/apis.xml");
                    var items = doc.Descendants("string");
                    foreach (XElement item in items)
                    {
                        if (item.Attribute("name").Value == api)
                        {
                            HttpClient webclient = new HttpClient();

                            HttpResponseMessage resp = webclient.PostAsync(new Uri(item.Value.ToString()), null).Result; //here
                            x = await resp.Content.ReadAsStringAsync();
                            try
                            {
                                await DataBase.saveStringToLocalFile(api + ".txt", x);
                                Debug.WriteLine("after writing");

                            }
                            catch (Exception ex)
                            {
                                throw ex;
                            }

                            Debug.WriteLine("after after writing");
                            jsonObject = JsonObject.Parse(x);
                            break;

                        }
                    }
                }
                return jsonObject;
            }
            catch (Exception)
            {
                MainPage.ShowCustomMessage(request_error_allert);
                return new JsonObject();

            }
        }
我用两个不同的API调用了GetObject两次。 当代码到达saveStringToFile函数时,它会崩溃:

  • 有时,它会在之后在saveStringTofile中崩溃 Debug.WriteLine(“1”)

  • 有时在调试之后。WriteLine(“2”)

  • 有时在调试之后。WriteLine(“3”)

  • 有时在Debug.WriteLine之后(“在编写之后”)

  • 有时,它在第一次使用第一个API时工作,并崩溃 第二个


它的行为真的很奇怪,我试图用每个断点捕捉它,但它每次都随机崩溃。我遗漏了什么?

您是否试图同时创建同一个文件两次?我不这么认为,因为这两个文件的文件名不同。问题是:同样的功能在Windows Phone 8.1上运行,但现在在Universal.Windows Phone 8.1中不起作用……如果你用不同的名称来称呼它,那就很奇怪了。文件是否可能在其他地方打开/未正确关闭?您是否尝试使用GenerateUniqueName而不是ReplaceExisting?它会崩溃吗?您是否已尝试将其放入try-catch块并查看抛出了什么异常?未处理的异常是否会被调用?当我使用GenerateUniqueName并一步一步地使用它时,它不会崩溃。在创建新文件之前,是否有方法明确删除LocalFolder中的文件?如果尝试删除某个正在使用的文件,则会出现异常。一般来说,使用ReplaceExisting应该可以,问题可能出在其他地方。您是否尝试过检查您遇到的异常类型?是否尝试同时创建同一文件两次?我不这么认为,因为这两个文件具有不同的文件名。问题是:同样的功能在Windows Phone 8.1上运行,但现在在Universal.Windows Phone 8.1中不起作用……如果你用不同的名称来称呼它,那就很奇怪了。文件是否可能在其他地方打开/未正确关闭?您是否尝试使用GenerateUniqueName而不是ReplaceExisting?它会崩溃吗?您是否已尝试将其放入try-catch块并查看抛出了什么异常?未处理的异常是否会被调用?当我使用GenerateUniqueName并一步一步地使用它时,它不会崩溃。在创建新文件之前,是否有方法明确删除LocalFolder中的文件?如果尝试删除某个正在使用的文件,则会出现异常。一般来说,使用ReplaceExisting应该可以,问题可能出在其他地方。您是否尝试过检查您遇到的异常类型?
 public static async Task saveStringToLocalFile(string filename, string content)
        {
            // saves the string 'content' to a file 'filename' in the app's local storage folder
            byte[] fileBytes = System.Text.Encoding.UTF8.GetBytes(content.ToCharArray());
            Debug.WriteLine("1");

            // create a file with the given filename in the local folder; replace any existing file with the same name
            StorageFile newFile = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
            Debug.WriteLine("2");

            // write the char array created from the content string into the file
            using (var stream = await newFile.OpenStreamForWriteAsync())
            {
                await stream.WriteAsync(fileBytes, 0, fileBytes.Length);
                Debug.WriteLine("3");
            }

            Debug.WriteLine("4");
        }