Cefsharp InvokeOnUiThreadIfRequired

Cefsharp InvokeOnUiThreadIfRequired

我将 chromium 从 75.x.x 更新为 85.x.x(最新),令我惊讶的是它给 InvokeOnUiThreadIfRequired()

带来了错误

我的代码:

private void Chrm_TitleChanged(object sender, TitleChangedEventArgs e)
{
    this.InvokeOnUiThreadIfRequired(() => tabControl.SelectedTab.Text = e.title);
}
private void Chrm_AddressChanged(object sender, AddressChangedEventArgs e)
{
    this.InvokeOnUiThreadIfRequired(() =>
    {
           url.Text = e.Address;
    });
}

错误消息:'MyForm' 不包含 'InvokeOnUiThreadIfRequired' 的定义,并且无法找到接受类型 'MyForm' 的第一个参数的可访问扩展方法 'InvokeOnUiThreadIfRequired'(是您缺少 using 指令或程序集引用?)

关于如何更改该代码以使其正常工作的任何建议?

在GitHub上搜索CefSharp问题只用了5分钟,找出原因:https://github.com/cefsharp/CefSharp/issues/2983

您可以通过将以下 class 添加到您的项目来解决这个问题,该项目是从 https://github.com/cefsharp/CefSharp/blob/cefsharp/75/CefSharp.WinForms/Internals/ControlExtensions.cs#L20 复制的:

public static class MyControlExtensions
{
    public static void InvokeOnUiThreadIfRequired(this Control control, Action action)
    {
        if (control.InvokeRequired)
        {
            control.BeginInvoke(action);
        }
        else
        {
            action.Invoke();
        }
    }
}

但是,更大的问题是您以错误的方式调用了此方法。您应该使用控件正在修改:

tabControl.InvokeOnUiThreadIfRequired(() => tabControl.SelectedTab.Text = e.title);

url.InvokeOnUiThreadIfRequired(() => url.Text = e.Address);