c# - 在异步方法中使用 await 来防止下一行代码运行

标签 c# winforms async-await cefsharp

我刚开始使用异步方法,所以我想我误解了什么。我有一个带有按钮的 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/

相关文章:

c# - SslStream 充当服务器时是否使用 LocalCertificateSelectionCallback?

c# - 函数用例

c# - 动态对象不显示其方法

c# - 为什么System.Timer不改变类成员变量?

c# - 使用 async-await 可以给您带来任何性能优势吗?

c# - 使用 Linq-to-sql 在 sql-server 中存储枚举

c# - 使用 iTextSharp PdfStamper 在现有 PDF 上叠加图像

c# - 将查询结果返回到列表框

c# - 如果我以昂贵的方法返回任务,是否应该添加 async 修饰符?

javascript - 如何使用 mongoose 中的用户对象 id 数组返回文档数组?