утечка памяти в EWS - PullRequest
       2

утечка памяти в EWS

1 голос
/ 12 апреля 2019

У нас есть приложение-служба, которое использует веб-службу Exchange.У нас проблема с памятью. Если я вызываю одну из следующих строк кода в моем сервисе, это вызывает утечку памяти в моем сервисном приложении.Пользовательское приложение обрабатывает много электронных писем, поэтому использование памяти будет постоянно увеличиваться и никогда не будет освобождено.

Примеры кода.

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

Но если я запусту нашу программу как приложение пользовательского интерфейса,все отлично работает без утечки памяти.Проблема возникает только при запуске нашей программы в качестве службы.Вам уже известна проблема, и у вас есть решение?

Я использую StreamingSubscript от EWS.Получите 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 Ответ

1 голос
/ 12 апреля 2019

Вы не даете нам достаточно кода, чтобы точно сказать, в чем ваша проблема - но я могу догадаться, что вы неправильно утилизируете предметы и / или 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 работать в службе. Это тоже может быть вашей проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...