无法使CefSharp加载同步

Ziv*_*Ziv 3 c# async-await chromium-embedded cefsharp

我有一个关闭屏幕ChromiumWebBrowser,我用来在页面上运行一些JS并获得结果.

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

为了使我的代码更清晰,我尝试创建一个扩展方法,允许我等待页面加载await而不是注册到事件.但是当我在TaskCompletionSource中使用这个方法时,没有加载在页面加载后应该运行的javascript,但是当使用AutoResetEvent并等待它时代码确实有效.

此代码不起作用:

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;
}
Run Code Online (Sandbox Code Playgroud)

这样做:

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;
}
Run Code Online (Sandbox Code Playgroud)

这是调用代码:

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

DoJsThing();
GetJsData();
Run Code Online (Sandbox Code Playgroud)

他们做同样的事情,但我觉得返回任务时函数的意图要比返回AutoResetEvent时更清楚.

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

ama*_*and 5

这是一个基本的例子https://gist.github.com/amaitland/40394439ddefdf4e66b7

注意我使用NavStateChanged它是一个更好的指示整个页面何时完成加载.

  • 它被重命名为`LoadingStateChanged`,有关示例,请参阅https://gist.github.com/amaitland/9d8897067bdff5b999a1#file-program-cs-L60 (2认同)