-
Notifications
You must be signed in to change notification settings - Fork 156
Closed
Labels
Description
Hi!
I'm trying to invoke a script's function from host while the script is in a loop. The function is invoked when the loop ends and not when is called.
This is the test code:
using System;
using Microsoft.ClearScript;
using Microsoft.ClearScript.V8;
namespace ConsoleJSTestApplication
{
internal class Program
{
public static void Main(string[] args)
{
var sourceCode = @"function main() {
host.writeLine('test');
var exit = false;
var i = 0;
while(i < 100)
{
host.writeLine('Iteration ' + i);
i++;
if(exit){
break;
}
}
host.writeLine('Exit');
}
host.setcallback(()=>{
host.writeLine('received callback');
exit=true;
});
main();";
var flags = V8ScriptEngineFlags.EnableTaskPromiseConversion | V8ScriptEngineFlags.HideHostExceptions |
V8ScriptEngineFlags.EnableStringifyEnhancements | V8ScriptEngineFlags.EnableDateTimeConversion |
V8ScriptEngineFlags.DisableGlobalMembers | V8ScriptEngineFlags.UseSynchronizationContexts
;
var engine = new V8ScriptEngine(flags);
engine.SuppressExtensionMethodEnumeration = true;
engine.AllowReflection = false;
engine.DisableExtensionMethods = true;
engine.SuppressInstanceMethodEnumeration = true;
engine.DisableDynamicBinding = true;
engine.DefaultAccess = ScriptAccess.ReadOnly;
var hostMethods = new HostMethods();
engine.AddRestrictedHostObject("host", hostMethods);
engine.Compile(new DocumentInfo { Category = DocumentCategory.Script },sourceCode);
Task.Run(() => { engine.Execute(new DocumentInfo { Category = DocumentCategory.Script }, sourceCode); });
Task.Delay(40).GetAwaiter().GetResult(); //make time to allow script to invoke the setcallback method
hostMethods._hostCallback(); //this only works when the loop ends.
Console.ReadLine();
}
}
public class HostMethods
{
public Action _hostCallback;
public void writeLine(string data)
{
Console.WriteLine(data);
}
public void setcallback(dynamic callback)
{
_hostCallback = () => callback();
}
}
}
This is the output:
test
Iteration 0
Iteration 1
Iteration 2
Iteration 3
Iteration 4
Iteration 5
Iteration 6
Iteration 7
Iteration 8
Iteration 9
Iteration 10
Iteration 11
Iteration 12
Iteration 13
Iteration 14
Iteration 15
Iteration 16
Iteration 17
Iteration 18
Iteration 19
Iteration 20
Iteration 21
Iteration 22
Iteration 23
Iteration 24
Iteration 25
Iteration 26
Iteration 27
Iteration 28
Iteration 29
Iteration 30
Iteration 31
Iteration 32
Iteration 33
Iteration 34
Iteration 35
Iteration 36
Iteration 37
Iteration 38
Iteration 39
Iteration 40
Iteration 41
Iteration 42
Iteration 43
Iteration 44
Iteration 45
Iteration 46
Iteration 47
Iteration 48
Iteration 49
Iteration 50
Iteration 51
Iteration 52
Iteration 53
Iteration 54
Iteration 55
Iteration 56
Iteration 57
Iteration 58
Iteration 59
Iteration 60
Iteration 61
Iteration 62
Iteration 63
Iteration 64
Iteration 65
Iteration 66
Iteration 67
Iteration 68
Iteration 69
Iteration 70
Iteration 71
Iteration 72
Iteration 73
Iteration 74
Iteration 75
Iteration 76
Iteration 77
Iteration 78
Iteration 79
Iteration 80
Iteration 81
Iteration 82
Iteration 83
Iteration 84
Iteration 85
Iteration 86
Iteration 87
Iteration 88
Iteration 89
Iteration 90
Iteration 91
Iteration 92
Iteration 93
Iteration 94
Iteration 95
Iteration 96
Iteration 97
Iteration 98
Iteration 99
Exit
received callback
Thanks!