2013-07-05 31 views
1

我有一個處理大量內存數據的應用程序。現在,有時發生的是2GB /應用程序的內存限制已達到,我的程序掛起。任務管理器中的內存使用情況不一致(連續波動從2GB到6GB) 我想要的是當內存使用達到特定限制時,程序應該優雅地退出。我不想手動干預用戶查殺應用程序。這可能嗎?C#.Net關閉超出內存使用量的應用程序

+5

重新編寫應用程序以不使用所有可用內存和/或跟蹤內存泄漏(如果它沒有按設計使用所有內存)不是更好嗎? –

+0

你有沒有想過用戶會如何感覺到它在彈出消息「對不起的內存閾值點擊..戈塔去」的消息中,他會砸他的頭:( – V4Vendetta

+1

你說的是多大的數據?處理terrabytes的數據也可以用適當的編碼和設計進行管理,我認爲你應該嘗試改進你的應用程序,我會很樂意更多地瞭解你的應用程序的確如此...... – Sandy

回答

6

您應該分配一個後臺監視線程,該線程輪詢System.Diagnostics.Process.GetCurrentProcess()。PrivateMemorySize64,然後相應地處理返回的大小。

例如,

public class MonitoringThread : Thread{ 
... 

bool working = true; 
void run(){ 
    while(working){ 
     long size = Process.GetCurrentProcess().PrivateMemorySize64; 
     if (size > 2000000000){ 
     //do anything 
     } 
     else { 
     try{ 
      Thread.Sleep(1000); 
     } 
     catch{} 
     } 
    } 
} 

} 

請注意,我只是在這個頁面寫了這個代碼,因此它可能不是太準確:)

+0

爭吵API在調用當前提交內存大小之前,您應該先調用Process.Refresh(); http://msdn.microsoft.com/zh-cn/library/system.diagnostics .process.refresh.aspx。 – dash

+0

不,我沒有正確存儲Process的引用,因爲這個原因:每次調用「Process.GetCurrentProcess()」時都會在不緩存的情況下創建新的進程快照。 – LittleSweetSeas

+0

你說得對,我假設Process.GetCurrentProcess()緩存對當前進程的引用,但它每次都會創建一個新對象。 – dash