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

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的工作方式?

Ser*_*rvy 5

不,问题不await在于,问题是在您准备好继续之前,Task返回的EvaluateScriptAsync已被标记为已完成.一旦javascript通知浏览器它应该滚动已经执行,它将被标记为已完成,而不是在浏览器在发送滚动命令后重新渲染屏幕后被标记为已完成.