Утечка памяти, как бороться C#

231
11 июля 2017, 18:26

Коллеги, здравствуйте! Имею вот такой код. Идет постоянная утечка памяти, поскольку через данное соединение передаются jpeg'ги. Как лучше всего чистить память?

public static V83.COMConnector com1s = new V83.COMConnector(); //{ get { return com1s;   }  set { com1s = value; } } 
dynamic res1c { get; set; } //Временная переменная для соединения
public static dynamic Connect1c(string Server1c, string Base1c, string login1c, string password1c, out string status1)
{
    // dynamic result;
    string StrConnect = "Srvr='" + Server1c + "';Ref='" + Base1c + "';Usr='" + login1c + "';Pwd='" + password1c + "';";
    dynamic result1;
    com1s.PoolCapacity = 10;
    com1s.PoolTimeout = 60;
    try
    {
        result1 = com1s.Connect(StrConnect);
        // Проверка соединения
        var FunctionQry = result1.МобильныйМастерПриемщик.ПолучитьXML("ВЫБРАТЬ  ИСТИНА");
        // Передаем ссылку обратно.
        status1 = "OK";
        return result1;
    }
    catch (Exception ex)
    {
        status1 = "ERROR:1C:" + ex.Message;
        result1 = null;
        return result1;
    }
}
Answer 1

Проблема связана с тем, что сборщик мусора (Garbage Collector, GC) может высвободить память неиспользуемыми COM-объектами (а проблема, очевидно, именно в них) не сразу, даже в том случае, если GC был запущен по признаку нехватки памяти. Более того, даже принудительный вызов сборщика (GC.Collect()) не гарантирует высвобождение памяти, занимаемой неиспользуемым более COM-объектом.

Существуют два механизма для гарантированного высвобождения памяти, занимаемой COM-объектами: через AppDomain и через метод ReleaseComObject.

Использование AppDomain'а с точки зрения процессорного времени весьма дорогостояще, на фоне чего метод ReleaseComObject является оптимальным вариантом.

Попробуйте вот такой код для освобождения памяти:

System.Runtime.InteropServices.Marshal.ReleaseComObject(com1s);

При выполнении обратите внимание на возвращаемое этим методов значение int: если оно ненулевое, значит, на объект еще остались ссылки. В этом случае (а можно и сразу использовать именно такую реализацию) вызывайте метод в цикле до тех пор, пока ссылок на объект не останется:

int refCount;
do
   refCount = System.Runtime.InteropServices.Marshal.ReleaseComObject(com1s);
while (refCount > 0);
Answer 2

если com1s является COM-объектом, то возможно, что result1 также является COM-объектом (Почему он dynamic-то?), а вы никогда не отпускаете этот com-объект - не в этом фрагменте кода, в любом случае. Так что есть утечка памяти.

READ ALSO
ember cli pagination как должен работать

ember cli pagination как должен работать

Всем приветПодскажите как правильно установить ember-cli-pagination, что бы он работал

339
Ошибка ajax скрипта в Firefox, который работает в Google Chrome

Ошибка ajax скрипта в Firefox, который работает в Google Chrome

Друзья, портирую расширение из Chrome на FirefoxУ FF много своих особенностей с которыми нужно как то найти общий язык

372
Как распарсить экранированный json?

Как распарсить экранированный json?

Помогите пожалуйста распарсить json

316