我有一个离屏的
为了使我的代码更清晰,我尝试创建一个扩展方法,允许我使用
以下代码无效:
这是调用代码:
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指示我已经完成了?我做错了什么吗?
await
只会阻塞而不会返回吗? - amaitlandMinimalExample
来演示你的确切问题?https://github.com/cefsharp/CefSharp.MinimalExample - amaitland