Я использую IronPython 2.6.2 для .NET 4.0 в качестве платформы сценариев в приложении C # / WPF.Скрипты могут включать свои собственные определения функций, определения классов и т. Д. Я не ограничиваю то, что можно написать.
Утечка памяти появилась в части скрипта недавно после изменения скрипта.Закомментировав все больше и больше кода, мы определили, что определение и вызов функции с более чем 13 параметрами вызывает утечку памяти.Так что если вы вызываете функцию с 14 параметрами, IronPython будет иметь утечку.
Вот пример кода для таймера, работающего каждые 100 мс:
_Timer.Enabled = false;
try
{
var engine = Python.CreateEngine();
engine.Execute("def SomeFunc(paramI, paramII, paramIII, paramIV, paramV, paramVI, paramVII, paramVIII, paramIX, paramX, paramXI, paramXII, paramXIII, paramXIV):\r\n\tpass\r\nSomeFunc(1,2,3,4,5,6,7,8,9,10,11,12,13,14)");
//engine.Execute("def SomeFunc(paramI, paramII, paramIII, paramIV, paramV, paramVI, paramVII, paramVIII, paramIX, paramX, paramXI, paramXII, paramXIII):\r\n\tpass\r\nSomeFunc(1,2,3,4,5,6,7,8,9,10,11,12,13)");
// With and without the following line makes no difference
engine.Runtime.Shutdown();
this.Dispatcher.Invoke((Action)delegate()
{
this.Title = DateTime.Now.ToString();
});
}
catch (Exception)
{
}
_Timer.Enabled = true;
Обратите внимание, что у меня есть версия с 14 параметрамисценарий и ниже это закомментированная версия с 13 параметрами.Сценарий Python в основном такой:
def SomeFunc(paramI, paramII, paramIII, paramIV, paramV, paramVI, paramVII, paramVIII, paramIX, paramX, paramXI, paramXII, paramXIII, paramXIV):
pass
SomeFunc(1,2,3,4,5,6,7,8,9,10,11,12,13,14)
Я пробовал с и без engine.Runtime.Shutdown (), но это не имеет значения.Память версии с 14 параметрами будет стремительно расти, а память версии с 13 параметрами немного увеличится и стабилизируется.
Есть мысли?
Спасибо - Шон