2015-12-18 120 views
1

我正在開發Outlook插件。我在Outlook工具欄中添加了一個按鈕,當用戶單擊該按鈕時,一個web服務被調用。取決於該web服務的結果,一個usercontrol被加載到一個自定義任務窗格中。當用戶關閉自定義任務窗格時,我調用用戶控件上的dispose方法。我還處置該用戶的子控件控制其處置的事件,並從customtaskpanes列表中刪除自定義任務窗格。但內存不釋放。我還處理了自定義任務窗格。但沒有發生任何事情。因此,這是我的編碼問題,還是它是一個問題與Outlook?我正在與.NET Framework 3.5的WinForms。無論何時按下按鈕,Outlook佔用的內存都會不斷增加。當窗格關閉時,在Outlook自定義任務窗格中打開的用戶控件在窗格關閉時不會被釋放

+0

您是否使用內存分析器檢查了您的應用程序?這會讓你知道什麼物體不會從記憶中釋放出來,是找到實際問題的最佳選擇。 – DimitarD

+0

我知道用戶控件沒有被處置 –

+0

你點了多少時間按鈕?也許垃圾收集器還沒有決定收集內存。 –

回答

1

很難判斷在沒有任何代碼示例的情況下是否發生內存泄漏。請記住,分析託管內存可能會很棘手...

但是,我的建議是,你可能不應該手動處理你的VSTO任務窗格控件。如果用戶單擊隱藏任務窗格,則任務窗格不會「銷燬」,您不應註銷它。其可見性屬性設置爲false。 請參閱以下Startup.addin.cs中的示例代碼,該代碼允許切換TaskPane可見性。

 public const string productName = "myMillionDollarAddin"; 
     private void RegisterTaskPane() 
     { 
      var tskControl = new TaskPaneControl(); 
      CustomTaskPane taskPane = this.CustomTaskPanes.Add(tskControl, productName); 
      taskPane.Visible = true; 
     } 

     public void ShowHideTaskPane() 
     { 
      var taskPane = this.CustomTaskPanes.FirstOrDefault(ctp => ctp.Title == productName); 
      if (taskPane == null) 
      { 
       RegisterTaskPane(); 
      } 
      else 
      { 
       var visibility = taskPane.Visible; 
       taskPane.Visible = !visibility; 
      } 
     } 
+0

Thanx,你的代碼有很多幫助。前景每次佔用大約5 MB的額外空間,我用來點擊按鈕。但現在它只需要大約200 KB。可以,這200 KB也可以刪除。因爲現在所有我正在做的是一個web服務調用。 –

+0

嗨,如果切換任務窗格可見性是您採取的方法,請將答案標記爲已接受。現在關於內存管理,對於一個.NET進程恕我直言,你不應該試圖調查沒有內存分析器的內存。您可能需要刷新Web服務調用的數據(如果它們很多),以便它們被垃圾收集。但是,您不應該通過清除表單控件來嘗試優化200KB的託管內存。所有.NET開發人員都必須閱讀以下[鏈接](https://www.simple-talk.com/redgatebooks/ChrisFarrell/Under_the_Hood_of_NET_Management.pdf)。 –

+0

我會在回覆之後將其標記爲回答。因爲如果在那之前我會這樣做,那麼您可能不會回覆。 –

相關問題