Коллеги, здравствуйте! Имею вот такой код. Идет постоянная утечка памяти, поскольку через данное соединение передаются 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;
}
}
Проблема связана с тем, что сборщик мусора (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);
если com1s является COM-объектом, то возможно, что result1 также является COM-объектом (Почему он dynamic-то?), а вы никогда не отпускаете этот com-объект - не в этом фрагменте кода, в любом случае. Так что есть утечка памяти.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Всем приветПодскажите как правильно установить ember-cli-pagination, что бы он работал
Друзья, портирую расширение из Chrome на FirefoxУ FF много своих особенностей с которыми нужно как то найти общий язык