【问题标题】:memory leak in EWSEWS 中的内存泄漏
【发布时间】:2019-04-12 17:10:15
【问题描述】:

我们有一个使用 Exchange Web 服务的服务应用程序。 我们有内存问题如果我在我的服务中调用以下代码行之一,这会导致我的服务应用程序中的内存泄漏。 用户应用处理大量邮件,内存占用会不断增加,再也不会被释放。

代码示例。

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);
    }   
}

【问题讨论】:

    标签: c#-4.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 在服务中运行。这也可能是你的问题。

    【讨论】:

    • 在服务器启动时我同步
    • 不知道是什么意思@Zhentao
    • 使用 Item.Bind 会不会造成内存泄漏?
    • 如果我将应用程序作为 UI 启动,那么我没有内存问题
    • 我知道@Zhentao 你在你的问题中这么说。这就是为什么我说了我在回答中所说的话。你看我的回答了吗?
    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2015-12-01
    • 2010-12-20
    • 2020-05-26
    • 2012-08-20
    相关资源
    最近更新 更多