2015-12-18 92 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

我会在回复之后将其标记为回答。因为如果在那之前我会这样做,那么您可能不会回复。 –

相关问题