You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

async lambda无法转换为Func<string, bool>错误的解决方法

问题解决:async lambda无法转换为Func<string, bool>的错误处理

错误原因

你遇到的核心问题是:async lambda表达式会自动返回Task<bool>类型,但你的SignInRequestHandler和SignInResourceRequestHandler构造函数要求的是同步委托Func<string, bool>(直接返回bool值),两种类型完全不兼容。此外,CefSharp的OnBeforeResourceLoad是同步执行方法,不能直接在这里阻塞等待异步操作完成,必须借助Cef提供的异步回调机制来处理。

解决方案

步骤1:修改委托类型

将两个处理器类中的同步委托替换为异步委托Func<string, Task<bool>>:

private class SignInRequestHandler : RequestHandler, IDisposable
{
    private readonly SignInResourceRequestHandler _resourceRequestHandler;

    // 修改构造函数参数为异步委托
    public SignInRequestHandler(Func<string, Task<bool>> urlHandler)
        : base()
    {
        _resourceRequestHandler = new SignInResourceRequestHandler(urlHandler);
    }

    protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, CefSharp.IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
    {
        return _resourceRequestHandler;
    }
}

private class SignInResourceRequestHandler : ResourceRequestHandler
{
    // 修改字段为异步委托
    private readonly Func<string, Task<bool>> _urlHandler;

    // 修改构造函数参数为异步委托
    public SignInResourceRequestHandler(Func<string, Task<bool>> urlHandler)
        : base()
    {
        _urlHandler = urlHandler;
    }
}

步骤2:重构OnBeforeResourceLoad以支持异步逻辑

利用IRequestCallback实现异步处理,避免阻塞同步线程:

protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, CefSharp.IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
{
    if (request == null || string.IsNullOrEmpty(request.Url))
    {
        return base.OnBeforeResourceLoad(chromiumWebBrowser, browser, frame, request, callback);
    }

    // 检查回调是否可用,启动异步逻辑
    if (!callback.IsDisposed)
    {
        // 启动异步任务,不在这里await避免阻塞
        _ = ProcessUrlAsync(request.Url, callback);
        // 告知Cef等待异步操作完成
        return CefReturnValue.ContinueAsync;
    }

    return base.OnBeforeResourceLoad(chromiumWebBrowser, browser, frame, request, callback);
}

// 单独封装异步处理逻辑
private async Task ProcessUrlAsync(string url, IRequestCallback callback)
{
    try
    {
        bool shouldCancel = await _urlHandler(url);
        // 通过回调通知Cef是否允许请求继续:true=允许,false=取消
        await callback.ContinueAsync(!shouldCancel);
    }
    catch (Exception)
    {
        // 异常情况下默认允许请求继续,可根据需求调整
        await callback.ContinueAsync(true);
        // 可在此添加日志记录
    }
    finally
    {
        // 确保回调资源被释放
        callback.Dispose();
    }
}

步骤3:调整lambda表达式

保留async关键字,但无需手动返回Task.FromResult,async方法会自动包装返回值:

var requestHandler = new SignInRequestHandler(async stringUrl =>
{
    if (stringUrl.StartsWith(options.EndUrl))
    {
        var cookieManager = Cef.GetGlobalCookieManager();
        var cookies = await cookieManager.VisitAllCookiesAsync();
        if (cookies != null)
        {
            foreach (var cookie in cookies)
            {
                // 用OrdinalIgnoreCase代替ToLower(),效率更高且避免文化差异
                if (cookie.Name.Equals(options.CookieName, StringComparison.OrdinalIgnoreCase))
                {
                    var sessionCookie = new System.Net.Cookie(cookie.Name, cookie.Value, "/", cookie.Domain)
                    {
                        HttpOnly = true,
                        Secure = true
                    };

                    browserResult = new BrowserResult()
                    {
                        SessionCookie = sessionCookie
                    };
                    // 若需等待窗口关闭完成,可保留await;否则可直接调用
                    await signWindow.Dispatcher.BeginInvoke(new Action(signWindow.Close));
                    return true;
                }
            }
        }
    }

    return false;
});

关键注意点

  • 使用CefReturnValue.ContinueAsync告知Cef暂停请求处理,等待异步操作结果
  • 异步逻辑单独封装,避免阻塞Cef的同步执行线程
  • 字符串比较使用StringComparison.OrdinalIgnoreCase替代ToLower(),提升性能并避免潜在问题

内容的提问来源于stack exchange,提问作者Sara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:55:29