kyy
2025-07-02 07558e32634314eec359ec8437d97bdc5def64f9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// 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<object, bool> setResult;
        private readonly Func<Exception, bool> setException;
        private readonly SynchronizationContext syncContext;
 
        public DevToolsMethodResponseContext(Type type, Func<object, bool> setResult, Func<Exception, bool> 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<T>(Func<T, bool> 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<Func<T, bool>, T>)state;
                    kv.Key(kv.Value);
                }), new KeyValuePair<Func<T, bool>, T>(fn, value));
            }
        }
    }
}