-
Notifications
You must be signed in to change notification settings - Fork 49
Description
Hello,
I have a strange behaviour when calling embedded functions with too much parameters.
JavaScriptEngineSwitcher.ChakraCore.JsRt.JsUsageException: Runtime is active on another thread.
bei JavaScriptEngineSwitcher.ChakraCore.JsRt.JsErrorHelpers.ThrowIfError(JsErrorCode errorCode)
bei JavaScriptEngineSwitcher.ChakraCore.ChakraCoreJsEngine.<>c__DisplayClass24_0.b__0()
bei JavaScriptEngineSwitcher.ChakraCore.ScriptDispatcher.ScriptTaskWithResult1.Run() --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde --- bei JavaScriptEngineSwitcher.ChakraCore.ScriptDispatcher.Invoke[T](Func
1 func)
bei JavaScriptEngineSwitcher.ChakraCore.ChakraCoreJsEngine.InnerEvaluate(String expression, String documentName)
bei JavaScriptEngineSwitcher.ChakraCore.ChakraCoreJsEngine.InnerEvaluate[T](String expression, String documentName)
bei JavaScriptEngineSwitcher.ChakraCore.ChakraCoreJsEngine.InnerEvaluate[T](String expression)
bei JavaScriptEngineSwitcher.Core.JsEngineBase.Evaluate[T](String expression)
bei TestConsoleRun.Program.JavaScriptEngineSwitcherTest2() in Program.cs:Zeile 335.
I think something gets corrupted in background because with the next function call the program is crashing. When calling a function with too less parameters everything is working like expected. You can use the following code to reproduce this behaviour:
IJsEngineSwitcher engineSwitcher = JsEngineSwitcher.Current;
engineSwitcher.EngineFactories.Add(new ChakraCoreJsEngineFactory());
engineSwitcher.DefaultEngineName = ChakraCoreJsEngine.EngineName;
IJsEngine javaEngine = engineSwitcher.CreateEngine(ChakraCoreJsEngine.EngineName);
javaEngine.EmbedHostObject("Sleep", (Action<int>)System.Threading.Thread.Sleep);
Console.WriteLine("Sleep with correct parameters.");
Console.WriteLine(javaEngine.Evaluate("Sleep(2000);"));
try
{
Console.WriteLine("Sleep with too less parameters.");
Console.WriteLine(javaEngine.Evaluate("Sleep();")); // useful "parameter" exception
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine("Sleep with correct parameters.");
Console.WriteLine(javaEngine.Evaluate("Sleep(2000);"));
try
{
Console.WriteLine("Sleep with too much parameters.");
Console.WriteLine(javaEngine.Evaluate("Sleep(2000, true);")); // strange exception ("Runtime is active on another thread."), something is corrupted afterwards
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine("Sleep with correct parameters.");
Console.WriteLine(javaEngine.Evaluate("Sleep(2000);")); // never called because of program crash
Console.WriteLine("End");