C# 我可以等待webbrowser使用for循环完成导航吗?

C# 我可以等待webbrowser使用for循环完成导航吗?,c#,webbrowser-control,C#,Webbrowser Control,我有一个for循环: for (i = 0; i <= 21; i++) { webB.Navigate(URL); } 对于(i=0;i要在线程中等待,可以执行以下操作 System.Threading.Thread.Sleep(2000); //waits 2 seconds 不幸的是,它与导航完成时间没有关联。您不必使用另一个void函数。只需像这样使用lambda: webB.DocumentCompleted += (sender, e) => { //

我有一个for循环:

for (i = 0; i <= 21; i++)
{
  webB.Navigate(URL);
}

对于(i=0;i要在线程中等待,可以执行以下操作

 System.Threading.Thread.Sleep(2000); //waits 2 seconds

不幸的是,它与导航完成时间没有关联。

您不必使用另一个
void
函数。只需像这样使用
lambda

webB.DocumentCompleted += (sender, e) =>
{
    // your post-load code goes here
};

假设您在WinFroms应用程序中托管
WebBrowser
,则可以使用
async/await
模式在循环中轻松高效地完成此操作。请尝试以下操作:

async Task DoNavigationAsync()
{
    TaskCompletionSource<bool> tcsNavigation = null;
    TaskCompletionSource<bool> tcsDocument = null;

    this.WB.Navigated += (s, e) =>
    {
        if (tcsNavigation.Task.IsCompleted)
            return;
        tcsNavigation.SetResult(true);
    };

    this.WB.DocumentCompleted += (s, e) =>
    {
        if (this.WB.ReadyState != WebBrowserReadyState.Complete)
            return;
        if (tcsDocument.Task.IsCompleted)
            return;
        tcsDocument.SetResult(true); 
    };

    for (var i = 0; i <= 21; i++)
    {
        tcsNavigation = new TaskCompletionSource<bool>();
        tcsDocument = new TaskCompletionSource<bool>();

        this.WB.Navigate("http://www.example.com?i=" + i.ToString());
        await tcsNavigation.Task;
        Debug.Print("Navigated: {0}", this.WB.Document.Url);
        // navigation completed, but the document may still be loading

        await tcsDocument.Task;
        Debug.Print("Loaded: {0}", this.WB.DocumentText);
        // the document has been fully loaded, you can access DOM here
    }
}

我已经回答了一个类似的问题。

正确的方法是使用事件。
在你的循环中,你怎么知道导航已经完成了呢?也许你已经脱离了循环,但它仅仅完成了一半

另外,在等待时循环被调用,并且是

为了在页面准备就绪时得到通知,同时保持CPU可用于其他内容,请使用@Jashaszun建议的事件:

void YourFunction()
{
  //Do stuff...
  webB.DocumentCompleted += (sender, e) =>
  {
      //Code in here will be triggered when navigation is complete and document is ready
  };
  webB.Navigate(URL);
  //Do more stuff...
}

尝试使用以下任务:

for (i = 0; i <= 21; i++)
{
   Task taskA = Task.Factory.StartNew(() => webB.Navigate(URL));
   taskA.Wait();
}
for(i=0;i webB.Navigate(URL));
taskA.Wait();
}

希望我能帮上忙。

在for循环中使用这个while循环

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        WebBrowser1.Navigate("stackoverflow.com/")

    End Sub

    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

    ------yourcode------

    End Sub

End Class
while (webB.ReadyState != tagREADYSTATE.READYSTATE_COMPLETE)
            {
               Thread.Sleep(500);
            }

这将等待WebBrowser完全加载页面。

此答案有什么不好?@wudzik评论称,在运行过程中,CPU占用了大量资源。没有完成事件的每个解决方案(最佳)可能是CPU密集型,可能尝试使用
线程。睡眠
?@wudzik哦,会吗?好的,谢谢你的建议。是的,你会陷入循环,你会做一些事情(任何事情),它必须影响CPU。这将阻止导航,这需要webbrowser控件的宿主线程及时发送消息。您能解释一下当DocumentCompleted处理程序中的那些ifs被命中时,任务会发生什么情况吗?DocumentCompleted处理程序会被多次触发吗?@lexeme是的,它可能会被多次触发,e.g.对于带有
iframes
的文档。我记得我在其他地方详细介绍了这一点,如果有兴趣,请使用
webbrowser control
标记搜索我的其他答案。我尝试在我的winforms应用程序中实现静默打印。我接受了你的其他答案()作为基础。但我总是在未初始化的readystate中使用web浏览器。原因可能是什么?@lexeme,你的意思是该答案中的示例代码对你不起作用吗?NoStratio,出于某种原因,是的,它不起作用。我正在尝试打印pdf文档,可能与ie安全设置idk有关。WebBrowser停留在e未初始化的就绪状态。
while (webB.ReadyState != tagREADYSTATE.READYSTATE_COMPLETE)
            {
               Thread.Sleep(500);
            }