Ich verwende die Jint-Version: 13.0.0-Beta-1767.
Ich habe das Memory Leak wie folgt gefunden:
Bitte überprüfen. Dankeschön.
Sehr schöner Screenshot. Können Sie Code-Repro anhängen (als Text, nicht als Bild)?
Das ist meine Funktion:
öffentliche statische Zeichenfolge RunJavaScriptSchedule(GlobalScheduleModel _Schedule)
{
CancelTokenSourceEvent cancelToken = new CancelTokenSourceEvent();
Versuchen
{
SystemInterfaceBLL InterfaceFunctionObject = new SystemInterfaceBLL();
InterfaceFunctionObject.JavascriptScenesObj = _Schedule;
// For prevent the endless loop => Can't Refesh to change Command Data.
// => Check the Scription is running or not.
// => If not => Adding CancelationTokenSource for manual Cancel.
bool isOk = false;
foreach(var cancelSource in TriggerCheckingService.CancelEventList.ToList())
{
if (cancelSource == null)
{
TriggerCheckingService.CancelEventList.Remove(cancelSource);
continue;
}
if ((cancelSource.Id == _Schedule.Id) && (cancelSource.Type == EventType.ScheduleTrigger))
{
if (cancelSource.NumberThread > 0) return "Error: More Than One Threads Are Running";
cancelSource.NumberThread = 1;
isOk = true;
cancelToken = cancelSource;
break;
}
}
if(!isOk)
{
cancelToken = new CancelTokenSourceEvent(_Schedule.Id, EventType.ScheduleTrigger, 1);
TriggerCheckingService.CancelEventList.Add(cancelToken);
}
var engine = new Engine(options =>
{
// Use a cancellation token.
options.CancellationToken(cancelToken.CancelSource.Token);
});
engine.SetValue("SystemLib", InterfaceFunctionObject);
string command = _Schedule.JavaScriptAction;
var result = "";
try
{
result = engine.Execute(command).GetCompletionValue().ToString();
}
catch(Exception exp)
{
result = exp.ToString();
}
if (result.Trim() == "undefined") result = "";
TriggerCheckingService.CancelEventList.Remove(cancelToken);
// Update Data Only
if ((result != "null") && (result.Trim() != "")) result = result + "\n"; else result = "";
string debug = _Schedule.Debug ?? "";
GlobalScheduleDB.UpdateDebug(_Schedule, result + debug);
GlobalScheduleDB.UpdateLastTime(_Schedule, Helper.UnixTime.GetCurrentMilliSecond());
return (result + debug);
}
catch (Exception exp)
{
TriggerCheckingService.CancelEventList.Remove(cancelToken);
var result = exp.ToString();
// Update Data Only
if ((result != "null") && (result.Trim() != "")) result = result + "\n"; else result = "";
string debug = _Schedule.Debug ?? "";
GlobalScheduleDB.UpdateDebug(_Schedule, result + debug);
GlobalScheduleDB.UpdateLastTime(_Schedule, Helper.UnixTime.GetCurrentMilliSecond());
return result;
}
}
Es wurde ein Problem auf Esprima-Seite erstellt, da es besser ist, es zuerst dort zu beheben und es dann an Jint weiterzuleiten.
Danke @lahma , wie ich sehe, hast du es behoben und kannst du mir sagen, wie lange es bis zum nächsten Fix-Release
Es sollte ziemlich bald auf NuGet erscheinen, gerade hochgeladen. Danke für die Berichterstattung und Details!