我刚开始使用异步方法,所以我想我误解了什么。我有一个带有按钮的 WinForms 应用程序,当单击该按钮时,将调用一个异步方法。这必须是异步的,因为我需要对 Chromium Web 浏览器控件进行 javascript 调用(使用 CefSharp)。我需要确保此 javascript 已完成运行并且浏览器已更新,然后才能继续该方法的下一部分。
我主要是想将整个网页捕捉到一张图片中。我的方法是使用 javascript 更新页面上的滚动位置,然后使用 Graphics.CopyFromScreen 在每个位置截取屏幕截图。这主要有效,但偶尔生成的图像会有错误的网页“ block ”(例如,第一个位图重复两次)。这是我的代码:
// 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
如果我添加以下内容
await Task.Delay(1000);
在 EvaluateScriptAsync() 调用之后,最终图像每次都会正确显示。我正在假设正在调用 javascript 但在屏幕截图开始之前未完成。如果是这种情况,即使添加延迟也可能不起作用(如果 javascript 运行时间超过一秒怎么办?)。
我是不是误解了 async/await 的工作方式?
最佳答案
不,问题不在于 await
,问题在于从 EvaluateScriptAsync
返回的 Task
在您之前被标记为已完成准备继续。一旦通知浏览器它应该滚动的 javascript 已执行,它将被标记为完成,而不是在浏览器在发送滚动命令后完成重新渲染屏幕后被标记为完成。
关于c# - 在异步方法中使用 await 来防止下一行代码运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42535465/