Проблема с памятью в PowerBuilder 11.5 и COM-компоненте C #

Прежде всего, извините за мой английский.

Я разрабатываю компонент COM на C # (который реализует IDisposable), чтобы использовать его из PowerBuilder примерно так:

OLEObject lole_comComponent

lole_comComponent = Create OLEObject
lole_comComponent.ConnectToNewObject("MyComComponent")

[Do some stuff...]

lole_component.DisconnectObject()
destroy lole_component
GarbageCollect()

С помощью этого кода деструктор COM Component запускается при закрытии приложения. Я добавил к компоненту метод, который вызывает частный метод Dispose. Что-то вроде этого:

OLEObject lole_comComponent

lole_comComponent = Create OLEObject
lole_comComponent.ConnectToNewObject("MyComComponent")

[Do some stuff...]

lole_component.Close()  // this method calls Dispose(true)
lole_component.DisconnectObject()
destroy lole_component

GarbageCollect()

Ни в одном из двух примеров память, используемая компонентом, не высвобождается.

Как я могу освободить память, используемую компонентом COM?

Я использую PowerBuilder 11.5.1 Build 4740.


person Merrin    schedule 28.06.2011    source источник
comment
Не могли бы вы опубликовать код метода .Dispose() вашего класса C #?   -  person 3Dave    schedule 28.06.2011
comment
@David Это что-то вроде этого msdn .microsoft.com / es-es / library /   -  person Merrin    schedule 28.06.2011
comment
Вы делаете что-нибудь вроде lole_thing = lole_component.SomeThing? В таком случае вам нужно отключить и уничтожить lole_thing.   -  person Hugh Brackett    schedule 29.06.2011
comment
@Hugh - хороший улов, если посмотреть на код, есть две разные переменные OLEObject, на которые ссылаются. Конечно, это также может быть просто типаж.   -  person Calvin Allen    schedule 30.06.2011
comment
@Hugh @HillBilly Это ошибка. lole_component и lole_component - это одна и та же переменная. Я назначил переменные двумя способами: 1: lole_thing = lole_com.Property ... lole_thing.DisconnectObject () и уничтожить lole_thing. 2: lole_thing.SetAutomationPointer (lole_com.Property) и diconnect и уничтожить в конце процесса.   -  person Merrin    schedule 30.06.2011


Ответы (1)


Я признаюсь, что не знаю, кто владеет памятью в этой ситуации, PowerBuilder или элемент управления, но один факт, который может быть полезным (или нет), - это тот факт, что PowerBuilder имеет тенденцию зависать в памяти, которую он выделяет из ОС. . Теоретически запросы к памяти являются дорогостоящими операциями, поэтому вместо того, чтобы проходить циклы запроса и освобождения памяти (PB не знает, что вы собираетесь делать дальше), он просто зависает в запрошенной памяти и не выполняет нужно прямо сейчас.

HTH,

Терри.

person Terry    schedule 28.06.2011
comment
Я понимаю. Приложение My PB работает как служба Windows и получает запросы на выполнение действий, и для одного из этих действий требуется компонент COM. Если я не могу освободить определенные объекты (в данном случае OLEObjects, затронутые компонентом COM, отличным от ConnectToNewObject), память моей службы будет увеличиваться до сбоев, обычно это проблемы с памятью. Еще кое-что ... COM-компонент прост, я думаю, он не настолько сложен, чтобы требовать расширенного управления памятью. Тем не менее, все реализует IDisposable для правильного выпуска. - person Merrin; 28.06.2011
comment
Итак, чтобы было ясно, когда PowerBuilder "зависает" в памяти, он будет повторно использовать ее. При втором вызове вашего COM-объекта PB может повторно использовать память, выделенную в первый раз, при условии, что она еще не используется чем-то другим. Если не будет утечки памяти, описанная мною характеристика PB не приведет к нехватке памяти. - person Terry; 29.06.2011
comment
Создается впечатление, что память не используется повторно, потому что каждый раз, когда вызывается COM-компонент, объем памяти увеличивается примерно. 150-300К - person Merrin; 29.06.2011
comment
@Merrin: Определенно ошибка, но, как я уже сказал, у меня нет предыстории, чтобы предположить, что это определенно PB или определенно COM-объект; Я не знаю, кому принадлежит эта утраченная память. Все, что я предлагал, может быть отвлекающим маневром. - person Terry; 29.06.2011