WP8内存不足,墓碑时存储状态失败怎么办?

时间:2020-12-12 15:20:54
应用程序向手机新增联系人,当增加的联系人超过1000时,会引发异常,具体操作为:(增加联系人是个异步方法, 在增加过程中更新进度条)增加联系人时按home键休眠或墓碑程序,然后再返回时回报异常:
【message】      "State saving failed. This is most likely due to insufficient State buffer  capacity.   App requires [3342315] bytes which likely exceeds NavServer limit"
【source】       "Microsoft.Phone.Interop"
【stacktrace】   "at Microsoft.Phone.TaskModel.Interop.Task.SaveTaskState()  
              at Microsoft.Phone.TaskModel.Interop.Task.FireOnPause(UInt32 reason)"
请问这是怎么造成的,该如何处理?

16 个解决方案

#1


个人认为这应该从联系人备份逻辑来解决,而不是考虑墓碑机制。

#2


引用 1 楼 91program 的回复:
个人认为这应该从联系人备份逻辑来解决,而不是考虑墓碑机制。

楼上解读有误,这是一个添加联系人的应用程序,由于数据比较大,在添加过程中可能会按home键或其他方式是程序休眠了,会执行Application_Deactivated,然后会出现如上所说的bug.

  我在Application_Activated中需要恢复的是整个应用程需使用的全局变量,我想问问大家的全局变量在墓碑后是如何恢复的。

#3


比如我的全局数据是

   public class GlobalInfo
    {;
        public List<Contact> replaeContacts = new List<Contact>();
        public List<Contact> AllContacts = new List<Contact>();
    }

private void Application_Deactivated(object sender, DeactivatedEventArgs e)
  {
       if (GlobalContactinfo != null)
          PhoneApplicationService.Current.State["data"] = Globalinfo;

  }

Globalinfo是全局数据,在每个页面都需要用,由于数据多,所有就出现了bug,请问该如何存储这些全局量。

#4


所以要解决数据多的问题,可以考虑将接收到的数据放在独立存贮的空间中,写成文件。这样就没有必要开那样大的全局数据。

#5


引用 4 楼 91program 的回复:
所以要解决数据多的问题,可以考虑将接收到的数据放在独立存贮的空间中,写成文件。这样就没有必要开那样大的全局数据。

 那比如说我把数据存储在独立存储空间后,然后每次墓碑的时候都要重新读取吗?

#6


引用 5 楼 chyun7290 的回复:
Quote: 引用 4 楼 91program 的回复:

所以要解决数据多的问题,可以考虑将接收到的数据放在独立存贮的空间中,写成文件。这样就没有必要开那样大的全局数据。

 那比如说我把数据存储在独立存储空间后,然后每次墓碑的时候都要重新读取吗?


我的处理逻辑是先解析csv文件,然后把解析的数据加到Globalinfo.AllContacts中,然后对Globalinfo.AllContacts进行引用,比如说后面页面的数据显示,都需要从Globalinfo.AllContacts中获取,我每次墓碑后都需要从独立存储读数据吗?

#7


墓碑时不一定要存储在内存的state里面,数据量太大完全可以先存在本地。

#8


引用 7 楼 lixygibli 的回复:
墓碑时不一定要存储在内存的state里面,数据量太大完全可以先存在本地。

如何存储在本地?

#9


IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
if(isf)
{
IsolatedStorageFileStream isfStream = new IsolatedStorageFileStream("Contacts.csv", FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read, isf);
byte[] buffer = "你需要保存的数据" 转换成的byte数组;
if(isfStream)
{
isfStream.Write(buffer, 0, buffer.Length);
}

isfStream.Close();
}

这样就把数据保存在了IsolatedStore的根目录底下的Contacts.csv文件里了

#10


现把list存本地,然后把导入的序号记在墓碑里。

#11


我是这样解决的,
 
 private IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;

private void Application_Deactivated(object sender, DeactivatedEventArgs e)
        {
            if (GlobalContactinfo != null)
                settings["value"] = GlobalContactinfo;
        }

使用IsolatedStorageSettings 存储状态,暂时是没有问题,但是我觉得数据再大点还是会出现问题。因为原因可能是:
 Like all app events, your app will be terminated if it takes  longer than 10 seconds to complete this handler. For this reason, we recommend that  you save your state incrementally throughout the lifetime of your app. This event is merely a final opportunity to save any unsaved data.

所以在Application_Deactivated时时间有限,我觉得我应该尽量减少将大数据都放在全局量里,在每个页面的OnNavigatingFrom中保存数据。

#12


引用 11 楼 chyun7290 的回复:
我是这样解决的,
 
 private IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;

private void Application_Deactivated(object sender, DeactivatedEventArgs e)
        {
            if (GlobalContactinfo != null)
                settings["value"] = GlobalContactinfo;
        }

使用IsolatedStorageSettings 存储状态,暂时是没有问题,但是我觉得数据再大点还是会出现问题。因为原因可能是:
 Like all app events, your app will be terminated if it takes  longer than 10 seconds to complete this handler. For this reason, we recommend that  you save your state incrementally throughout the lifetime of your app. This event is merely a final opportunity to save any unsaved data.

所以在Application_Deactivated时时间有限,我觉得我应该尽量减少将大数据都放在全局量里,在每个页面的OnNavigatingFrom中保存数据。

你说的对。确实有可能失败。

#13


全局变量在墓碑后是如何恢复的?可以保存在phoneapplicationservice中,或是settings里面,就可以了

#14


WP8内存不足,墓碑时存储状态失败怎么办?忘了发表情了

#15


引用 13 楼 blogtjf 的回复:
全局变量在墓碑后是如何恢复的?可以保存在phoneapplicationservice中,或是settings里面,就可以了

因为数据太大用phoneapplicationservice就报异常了啊?我是用IsolatedStorageSettings解决的,您一般情况下是如何解决的。

#16


上表请 WP8内存不足,墓碑时存储状态失败怎么办?

#1


个人认为这应该从联系人备份逻辑来解决,而不是考虑墓碑机制。

#2


引用 1 楼 91program 的回复:
个人认为这应该从联系人备份逻辑来解决,而不是考虑墓碑机制。

楼上解读有误,这是一个添加联系人的应用程序,由于数据比较大,在添加过程中可能会按home键或其他方式是程序休眠了,会执行Application_Deactivated,然后会出现如上所说的bug.

  我在Application_Activated中需要恢复的是整个应用程需使用的全局变量,我想问问大家的全局变量在墓碑后是如何恢复的。

#3


比如我的全局数据是

   public class GlobalInfo
    {;
        public List<Contact> replaeContacts = new List<Contact>();
        public List<Contact> AllContacts = new List<Contact>();
    }

private void Application_Deactivated(object sender, DeactivatedEventArgs e)
  {
       if (GlobalContactinfo != null)
          PhoneApplicationService.Current.State["data"] = Globalinfo;

  }

Globalinfo是全局数据,在每个页面都需要用,由于数据多,所有就出现了bug,请问该如何存储这些全局量。

#4


所以要解决数据多的问题,可以考虑将接收到的数据放在独立存贮的空间中,写成文件。这样就没有必要开那样大的全局数据。

#5


引用 4 楼 91program 的回复:
所以要解决数据多的问题,可以考虑将接收到的数据放在独立存贮的空间中,写成文件。这样就没有必要开那样大的全局数据。

 那比如说我把数据存储在独立存储空间后,然后每次墓碑的时候都要重新读取吗?

#6


引用 5 楼 chyun7290 的回复:
Quote: 引用 4 楼 91program 的回复:

所以要解决数据多的问题,可以考虑将接收到的数据放在独立存贮的空间中,写成文件。这样就没有必要开那样大的全局数据。

 那比如说我把数据存储在独立存储空间后,然后每次墓碑的时候都要重新读取吗?


我的处理逻辑是先解析csv文件,然后把解析的数据加到Globalinfo.AllContacts中,然后对Globalinfo.AllContacts进行引用,比如说后面页面的数据显示,都需要从Globalinfo.AllContacts中获取,我每次墓碑后都需要从独立存储读数据吗?

#7


墓碑时不一定要存储在内存的state里面,数据量太大完全可以先存在本地。

#8


引用 7 楼 lixygibli 的回复:
墓碑时不一定要存储在内存的state里面,数据量太大完全可以先存在本地。

如何存储在本地?

#9


IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
if(isf)
{
IsolatedStorageFileStream isfStream = new IsolatedStorageFileStream("Contacts.csv", FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read, isf);
byte[] buffer = "你需要保存的数据" 转换成的byte数组;
if(isfStream)
{
isfStream.Write(buffer, 0, buffer.Length);
}

isfStream.Close();
}

这样就把数据保存在了IsolatedStore的根目录底下的Contacts.csv文件里了

#10


现把list存本地,然后把导入的序号记在墓碑里。

#11


我是这样解决的,
 
 private IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;

private void Application_Deactivated(object sender, DeactivatedEventArgs e)
        {
            if (GlobalContactinfo != null)
                settings["value"] = GlobalContactinfo;
        }

使用IsolatedStorageSettings 存储状态,暂时是没有问题,但是我觉得数据再大点还是会出现问题。因为原因可能是:
 Like all app events, your app will be terminated if it takes  longer than 10 seconds to complete this handler. For this reason, we recommend that  you save your state incrementally throughout the lifetime of your app. This event is merely a final opportunity to save any unsaved data.

所以在Application_Deactivated时时间有限,我觉得我应该尽量减少将大数据都放在全局量里,在每个页面的OnNavigatingFrom中保存数据。

#12


引用 11 楼 chyun7290 的回复:
我是这样解决的,
 
 private IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;

private void Application_Deactivated(object sender, DeactivatedEventArgs e)
        {
            if (GlobalContactinfo != null)
                settings["value"] = GlobalContactinfo;
        }

使用IsolatedStorageSettings 存储状态,暂时是没有问题,但是我觉得数据再大点还是会出现问题。因为原因可能是:
 Like all app events, your app will be terminated if it takes  longer than 10 seconds to complete this handler. For this reason, we recommend that  you save your state incrementally throughout the lifetime of your app. This event is merely a final opportunity to save any unsaved data.

所以在Application_Deactivated时时间有限,我觉得我应该尽量减少将大数据都放在全局量里,在每个页面的OnNavigatingFrom中保存数据。

你说的对。确实有可能失败。

#13


全局变量在墓碑后是如何恢复的?可以保存在phoneapplicationservice中,或是settings里面,就可以了

#14


WP8内存不足,墓碑时存储状态失败怎么办?忘了发表情了

#15


引用 13 楼 blogtjf 的回复:
全局变量在墓碑后是如何恢复的?可以保存在phoneapplicationservice中,或是settings里面,就可以了

因为数据太大用phoneapplicationservice就报异常了啊?我是用IsolatedStorageSettings解决的,您一般情况下是如何解决的。

#16


上表请 WP8内存不足,墓碑时存储状态失败怎么办?