private static void AttachJsInterop(IPC ipc, CancellationToken appLifetime)
        {
            var desktopSynchronizationContext = new DesktopSynchronizationContext(appLifetime);

            SynchronizationContext.SetSynchronizationContext(desktopSynchronizationContext);

            ipc.On("BeginInvokeDotNetFromJS", args =>
            {
                desktopSynchronizationContext.Send(state =>
                {
                    var argsArray = (object[])state;
                    DotNetDispatcher.BeginInvokeDotNet(
                        DesktopJSRuntime,
                        new DotNetInvocationInfo(
                            assemblyName: argsArray[1] != null ? ((JsonElement)argsArray[1]).GetString() : null,
                            methodIdentifier: ((JsonElement)argsArray[2]).GetString(),
                            dotNetObjectId: ((JsonElement)argsArray[3]).GetInt64(),
                            callId: ((JsonElement)argsArray[0]).GetString()),
                        ((JsonElement)argsArray[4]).GetString());
                }, args);
            });

            ipc.On("EndInvokeJSFromDotNet", args =>
            {
                desktopSynchronizationContext.Send(state =>
                {
                    var argsArray = (object[])state;
                    DotNetDispatcher.EndInvokeJS(
                        DesktopJSRuntime,
                        ((JsonElement)argsArray[2]).GetString());
                }, args);
            });
        }
Example #2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PlatformDispatcher"/> class.
 /// </summary>
 /// <param name="cancellationToken">The cancellation token to pass to the synchronizationcontext.</param>
 public PlatformDispatcher(CancellationToken cancellationToken)
 {
     this.context = new DesktopSynchronizationContext(cancellationToken);
     this.context.UnhandledException += (sender, e) =>
     {
         this.OnUnhandledException(new UnhandledExceptionEventArgs(e, false));
     };
 }
            public WorkQueue(DesktopSynchronizationContext desktopSynchronizationContext, CancellationToken cancellationToken)
            {
                _desktopSynchronizationContext = desktopSynchronizationContext;
                _cancellationToken             = cancellationToken;
                _thread = new Thread(ProcessQueue);
                _thread.Start();

                // TODO prevents deadlock but parallelization problems
                //new Thread(ProcessQueue).Start();
            }