jar*_*uan 1 c# winforms async-await cefsharp
我是新手使用异步方法,所以我觉得我误解了一些东西.我有一个带按钮的WinForms应用程序,当单击该按钮时,会调用异步方法.这必须是异步的,因为我需要对Chromium Web Browser控件进行javascript调用(使用CefSharp).我需要确保此javascript已完成运行并且浏览器已更新,然后继续使用该方法的下一部分.
我基本上试图将整个网页捕获为单个图像.我的方法是使用javascript更新页面上的滚动位置,然后使用Graphics.CopyFromScreen在每个位置截取屏幕截图.这主要是有效的,但偶尔产生的图像将具有错误的网页"块"(例如,第一个位图重复两次).这是我的代码:
// Calculate screen sizes, screenshot spacing etc.
for (int i = 0; i < screenshotCount; i++)
{
int scrollSize = i == 0 ? -PageHeight : (int)browserControlHeight;
string script = "(function() { window.scrollBy(0, " + scrollSize.ToString() + ") })();";
await browser.EvaluateScriptAsync(script);
// Take screenshot, add to list of bitmaps
}
// Combine resulting list of bitmaps
Run Code Online (Sandbox Code Playgroud)
如果我添加以下内容
await Task.Delay(1000);
Run Code Online (Sandbox Code Playgroud)
在EvaluateScriptAsync()调用之后,每次最终图像都是正确的.我正在假设javascript被调用但在截图开始之前没有完成.如果是这种情况,即使添加延迟也可能不起作用(如果javascript运行的时间超过一秒,该怎么办?).
我是否误解了async/await的工作方式?
不,问题不await
在于,问题是在您准备好继续之前,Task
返回的EvaluateScriptAsync
已被标记为已完成.一旦javascript通知浏览器它应该滚动已经执行,它将被标记为已完成,而不是在浏览器在发送滚动命令后重新渲染屏幕后被标记为已完成.