gpt4 book ai didi

c# - 无法使 CefSharp 加载同步

转载 作者:行者123 更新时间:2023-11-30 14:53:20 24 4
gpt4 key购买 nike

我有一个屏幕外的 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;
}

这样做:

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,因为它可以更好地指示整个页面何时完成加载。

关于c# - 无法使 CefSharp 加载同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29728744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com