Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在异步方法中使用wait防止下一行代码运行_C#_Winforms_Async Await_Cefsharp - Fatal编程技术网

C# 在异步方法中使用wait防止下一行代码运行

C# 在异步方法中使用wait防止下一行代码运行,c#,winforms,async-await,cefsharp,C#,Winforms,Async Await,Cefsharp,我不熟悉使用异步方法,所以我想我误解了什么。我有一个带有按钮的WinForms应用程序,当单击按钮时,会调用一个异步方法。这必须是异步的,因为我需要对ChromiumWeb浏览器控件进行javascript调用(使用CefSharp)。我需要确保这个javascript已经运行完毕,并且在继续该方法的下一部分之前,浏览器已经更新 我基本上是想把整个网页捕捉到一张图片中。我的方法是使用javascript更新页面上的滚动位置,然后使用Graphics.CopyFromScreen在每个位置截图。这

我不熟悉使用异步方法,所以我想我误解了什么。我有一个带有按钮的WinForms应用程序,当单击按钮时,会调用一个异步方法。这必须是异步的,因为我需要对ChromiumWeb浏览器控件进行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
调用EvaluateScript Async()后,最终图像每次都显示正确。我的工作假设javascript正在被调用,但在屏幕截图开始之前没有完成。如果是这种情况,即使添加延迟也可能不起作用(如果javascript运行时间超过一秒钟怎么办?)


我是否误解了async/await的工作方式?

不,问题不在于
await
,而是从
EvaluateScript async
返回的
任务在您准备继续之前被标记为已完成。一旦javascript通知浏览器它应该滚动执行,它就会被标记为已完成,而不是在浏览器发送滚动命令后完成重新呈现屏幕后被标记为已完成。

因此,如果我在正在执行的javascript中添加一行额外内容以简单地返回true,这能解决问题吗?在javascript中假设下一行在滚动完成之前不会运行。@jardantuan第二个假设是不正确的。这是你问题的根源。如果这个假设是真的,那么你的代码就已经在工作了。这是有道理的。现在我在想,我可以在javascript中添加一个检查,看看滚动位置是否发生了变化,然后返回一些东西——这样行吗?也有可能我错过了一个更明显的修复方法。@jardantuan你可以试试。它可能反映了浏览器应该渲染的内容,而不是实际渲染的内容。你得试试看。
await Task.Delay(1000);