public int AddPromise(PromiseTask promise) { if (lastId < 0) { throw new IndexOutOfRangeException(nameof(lastId)); } promises[lastId] = promise; return(lastId++); }
protected override void DoAsyncWork(CefV8Context ctx, PromiseTask promiseTask) { int promiseId = pendingPromises.AddPromise(promiseTask); var browser = ctx.GetBrowser(); var frame = browser.GetMainFrame(); var msg = CefProcessMessage.Create("openFileRequest"); msg.Arguments.SetInt(0, (int)promiseId); // This kicks off the RFC chain. frame.SendProcessMessage(CefProcessId.Browser, msg); }
protected override void DoAsyncWork(CefV8Context ctx, PromiseTask promiseTask) { // Start running C# code in its own thread, no JS calls are allowed at this point. Task.Run(() => { try { var result = promiseWorker.Method.Invoke(promiseWorker.Target, callerArguments); promiseTask.Resolve(result); } catch (Exception ex) { promiseTask.Reject(ex); } }); }
/// <summary> /// Start executing the promise worker on a thread pool thread. /// </summary> /// <param name="arguments">The two callback provided by the JS side, one for resolving /// and one for rejecting the JS Promise. /// </param> protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception) { var resolveCb = arguments[0]; var rejectCb = arguments[1]; var ctx = CefV8Context.GetCurrentContext(); var promiseTask = new PromiseTask(ctx, resolveCb, rejectCb); DoAsyncWork(ctx, promiseTask); // A fulfiller function doesn't return anything -- it's equivalent to // a 'void' C# function, so return 'undefined' to JS side. returnValue = CefV8Value.CreateUndefined(); exception = null !; return(true); }
protected abstract void DoAsyncWork(CefV8Context ctx, PromiseTask promiseTask);