无法使CefSharp负载同步

齐夫

我在屏幕外ChromiumWebBrowser,用于在页面上运行一些JS并获取结果。

Load方法是同步的,但是在引发FrameLoadEnd事件之前,我无法运行JS代码,这意味着或我的目的Load是一个以FrameLoadEnd事件结尾的异步方法。

为了使代码更清晰,我尝试创建一种扩展方法,该方法将允许我等待页面加载使用,await而不是注册事件。但是,当我将此方法与TaskCompletionSource一起使用时,原本应该在页面加载后运行的javascript没有加载,但是当使用anAutoResetEvent并等待它运行时,代码确实起作用。

该代码不起作用:

public static Task LoadPageAsync(this IWebBrowser browser, string address)
{
    TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
    browser.FrameLoadEnd += (sender, args) =>
    {
        if (args.IsMainFrame)
        {
            tcs.TrySetResult(true);
        }
    };
    browser.Load(address);
    return tcs.Task;
}

这样做:

public static AutoResetEvent LoadPageAsync(this IWebBrowser browser, string address)
{
    AutoResetEvent are = new AutoResetEvent(false);
    browser.FrameLoadEnd += (sender, args) =>
    {
        if (args.IsMainFrame)
        {
            are.Set();
        }
    };
    browser.Load(address);
    return are;
}

这是调用代码:

await _browser.LoadPageAsync("Some web address");
LoadScripts();

DoJsThing();
GetJsData();

他们做同样的事情,但是我觉得返回任务比返回AutoResetEvent时,该函数的意图要清晰得多。

为什么不能使用TaskCompletionSource表示我完成了?难道我做错了什么?

阿米特兰
public static Task LoadPageAsync(IWebBrowser browser, string address = null)
{
    var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);

    EventHandler<LoadingStateChangedEventArgs> handler = null;
    handler = (sender, args) =>
    {
        //Wait for while page to finish loading not just the first frame
        if (!args.IsLoading)
        {
            browser.LoadingStateChanged -= handler;
            //Important that the continuation runs async using TaskCreationOptions.RunContinuationsAsynchronously
            tcs.TrySetResult(true);
        }
    };

    browser.LoadingStateChanged += handler;

    if (!string.IsNullOrEmpty(address))
    {
        browser.Load(address);
    }
    return tcs.Task;
}

请注意,我用LoadingStateChanged它来更好地指示整个页面何时完成加载。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CefSharp WebCam无法渲染

来自分类Dev

CefSharp WebCam无法渲染

来自分类Dev

RegisterJsObject CefSharp无法正常工作

来自分类Dev

cefsharp无法通过javascript播放音频

来自分类Dev

专注于负载无法正常工作

来自分类Dev

Python 的 Scapy 无法打印负载

来自分类Dev

无法进行 NginX 负载均衡

来自分类Dev

CurrentThreadTaskScheduler无法完成同步

来自分类Dev

GitLab无法同步fork

来自分类Dev

无法与输入的球拍同步

来自分类Dev

无法等待同步任务

来自分类Dev

CSS无法与HTML同步?

来自分类Dev

Mule ESB同步,直到成功修改有效负载

来自分类Dev

无法与Firebase同步访问阵列

来自分类Dev

laravel同步无法保存数据

来自分类Dev

脚本标记无法同步呈现

来自分类Dev

git rebase无法与远程同步?

来自分类Dev

GitHub无法同步此分支

来自分类Dev

drbd无法开始重新同步

来自分类Dev

假小子注释:无法同步

来自分类Dev

Angular Promise无法同步运行

来自分类Dev

MsDeploy同步无法正常工作

来自分类Dev

同步块无法正常运行

来自分类Dev

无法在Laravel中使用急切负载

来自分类Dev

Primefaces LazyDataModel负载覆盖无法正常工作

来自分类Dev

VSTS 负载测试无法找到程序集

来自分类Dev

Gradle无法与“无法找到可选库”同步

来自分类Dev

同步同步和Node.js无法创建表

来自分类常见问题

Apache负载均衡器数据跨多个应用程序同步