EWS中的内存泄漏

时间:2019-04-12 17:10:16

标签: c#-4.0

我们有一个使用Exchange Web Service的服务应用程序。 我们遇到内存问题如果我在服务中调用以下代码行之一,则会导致服务应用程序中发生内存泄漏。 用户应用程序处理大量电子邮件,因此内存使用量将持续增加,并且永远不会释放。

代码示例。

var item = Item.Bind(mServiceWrapper.Service, ItemId.UniqueId);
var folder = Folder.Bind(mServiceWrapper.Service,item.ParentFolderId.UniqueId);
EmailMessage.Load(new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.MimeContent));

但是,如果我以UI应用程序形式启动程序,则一切正常,而不会发生内存泄漏。 仅当将我们的程序作为服务启动时,才会出现此问题。 问题已经为您所知,您有解决方案吗?

我正在使用EWS中的StreamingSubscript。获取Emailas Exchange Server并将其存储在数据库中。

private void OnNotificationEvent(object sender, NotificationEventArgs args)
{
    var item = Item.Bind(mServiceWrapper.Service, mailItem.ItemId.UniqueId);
    var folder = Folder.Bind(mServiceWrapper.Service, mailItem.ParentFolderId.UniqueId);

    var propertySet = new PropertySet(BasePropertySet.FirstClassProperties);
    item.Load(propertySet);

    folder.Load(PropertiesProvider.FolderPropertySet);

    object[] data = new object[]
                                {
                                    item.Id.UniqueId,
                                    folder.Id.UniqueId,
                                    folder.ExtendedProperties.GetPropertyValue<long>(@"LexolutionContainerId"),
                                    folder.ExtendedProperties.GetPropertyValue<int>(@"TrayId")
                                };

}           

另一个线程将加载电子邮件并再次处理电子邮件。像这样

protected override void InternalWork(IJob job)
{
    try
    {
        object[] data = (object[]) job.DataObject;
        string itemUniqueId = (string) data[0];
        ItemId itemId = new ItemId(itemUniqueId);
        long targetContainerId = (long) data[2];

        var propertySet = new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.MimeContent,
                        EmailMessageSchema.InternetMessageId);
        var mail = Item.Bind(ExchangeWrapper.Service, itemId, propertySet);
    }   
}

1 个答案:

答案 0 :(得分:1)

您实际上没有给我们足够的代码来确定您的问题是什么-但我可以猜测您没有正确处理项目和/或未调用GC。

作为第一步(也是一般惯例),我将重构您的代码以使用using语句。因此,上面的代码将如下所示:

var item = Item.Bind(mServiceWrapper.Service, ItemId.UniqueId);
var folder = Folder.Bind(mServiceWrapper.Service,item.ParentFolderId.UniqueId);
using (var props = new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.MimeContent))
{
  EmailMessage.Load(props);
  // additional code
}

在代码中可能还有其他地方可以使用,这是一些文档 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement

此外,您还应考虑强制GC在服务中运行。这也可能是您的问题。