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); }); }
/// <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(); }