2012-01-16 6 views
1

EntitySetを持つオブジェクトがアプリケーション・ステートに保存されると、休止状態から再開するときにOutOfMemoryExceptionが発生します。次にコードの例を示します。OnActivateでPhoneApplicationService.Current.StateのEntitySet(ローカルdb)オブジェクトを使用したOutOfMemoryException

var list = new TaskList() { Title = "AA" }; 
list.TaskItems = new EntitySet<TaskItem>(); 
list.TaskItems.Add(new TaskItem() { Notes = "BB" });    
PhoneApplicationService.Current.State["CurrentList"] = list;//Fails only when resuming 
var list1 = (TaskList)PhoneApplicationService.Current.State["CurrentList"]; // WORKS FINE 
//PhoneApplicationService.Current.State["CurrentList"] = "AnyString" //Works fine; 

私は "開始"を押して、アプリケーションから離れて移動します。その後、私は "戻る"ボタンを押して休眠状態から再開させ、しばらくの間 "再開"と言い、しばらくしてからOutOfMemory例外を取得します。

「状態」からオブジェクトを保存して取得すると、正常に動作します。それは "再開"時のみ例外をスローします。なぜ誰が知っていますか?回避策はありますか?

答えて

0

コードでは、アプリケーションが休眠状態から再開しているときに、CurrentListをアプリケーション状態に保存していることを示しています。私はあなたがtombstoningで再開しないときにアプリケーション状態に保存するべきだと思います。ユーザーが前方に移動すると 非アクティブ化イベントが発生した後

休止

は、離れて、アプリケーションから、オペレーティングシステムが休止状態に アプリケーションを置くしようとします。この状態では、 アプリケーションのスレッドはすべて停止し、処理は行われませんが、 アプリケーションはメモリ内にそのまま残ります。アプリケーションが から再アクティブ化されている場合、アプリケーションは保存されているため、 は状態を再作成する必要はありません。

アプリケーションが 休眠行われた後、新しいアプリケーションが起動している場合は、これらのアプリケーションは、優れたユーザーエクスペリエンスを提供するために 利用可能であるよりも多くのメモリを必要とし、オペレーティングシステムがメモリを解放する 墓石休眠アプリケーションに開始されます。

http://msdn.microsoft.com/en-us/library/ff817008(v=vs.92).aspx

1

私は自分の質問に答えるのです。デシリアライゼーション中に失敗したTaskListとTaskItemオブジェクトの間に循環参照がありました。私はそれがEntitySetのために失敗したと思っていて、この質問をしました。申し訳ありません。

関連する問題