// Copyright © 2020 The CefSharp Authors. All rights reserved. // // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. using System; using System.Collections.Generic; using System.Threading; namespace CefSharp.DevTools { // Helper class for setting the method response in the correct sync context internal struct DevToolsMethodResponseContext { public readonly Type Type; private readonly Func setResult; private readonly Func setException; private readonly SynchronizationContext syncContext; public DevToolsMethodResponseContext(Type type, Func setResult, Func setException, SynchronizationContext syncContext) { Type = type; this.setResult = setResult; this.setException = setException; this.syncContext = syncContext; } public void SetResult(object result) { InvokeOnSyncContext(setResult, result); } public void SetException(Exception ex) { InvokeOnSyncContext(setException, ex); } private void InvokeOnSyncContext(Func fn, T value) { if (syncContext == null || syncContext == SynchronizationContext.Current) { fn(value); } else { // Using a KeyValuePair to pass the method and value into the callback to avoid capturing local variables in the delegate. syncContext.Post(new SendOrPostCallback(state => { var kv = (KeyValuePair, T>)state; kv.Key(kv.Value); }), new KeyValuePair, T>(fn, value)); } } } }