C# await & Task.Run

本文关键字:Task Run amp await | 更新日期: 2023-09-27 18:07:07

     private void button1_Click_1(object sender, EventArgs e)
     {
         webBrowser1.Navigate("http://www.naver.com");
     }
     private void button2_Click_1(object sender, EventArgs e)
     {
         HtmlWindow wf = webBrowser1.Document.Window.Frames[0];
         string s = wf.Document.Body.OuterHtml;
         MessageBox.Show(s);
     }

. .这确实有效……但我需要点击两个按钮。我想把它们放在一起。我写了下面的代码…错误出现在第二行(nullReferenceException)。看来await不起作用有人能帮忙吗?

     private async void button2_Click_1(object sender, EventArgs e)
     {
         await Task.Run(() => webBrowser1.Navigate("http://www.naver.com"));
         HtmlWindow wf = webBrowser1.Document.Window.Frames[0];
         string s = wf.Document.Body.OuterHtml;
         MessageBox.Show(s);
     }

C# await & Task.Run

导航开始下载。它在下载完成之前返回。你必须等待WebBrowser事件。documentcomplete事件

顺便说一下,因为导航不等待,直到加载它是快速的,没有必要异步调用它,否则微软会做一个异步版本,像在WebClient任务。

private void button2_Click_1(object sender, EventArgs e)
{
    webBrowser1.Navigate("http://www.naver.com");
}
private void OnDocumentCompleted(object sender, ...)
{
    HtmlWindow wf = webBrowser1.Document.Window.Frames[0];
    string s = wf.Document.Body.OuterHtml;
    MessageBox.Show(s);
}

如果您希望button2button1事件上自动执行,那么您可以使用Button。PerformClick方法

所以,你的代码是这样的:
 private void button1_Click_1(object sender, EventArgs e)
 {
     webBrowser1.Navigate("http://www.naver.com");
     button2.PerformClick();
 }
 private void button2_Click_1(object sender, EventArgs e)
 {
     HtmlWindow wf = webBrowser1.Document.Window.Frames[0];
     string s = wf.Document.Body.OuterHtml;
     MessageBox.Show(s);
 }

如果你想一起工作,那么你可以使用Load事件

Form Load上设置这些按钮点击事件
public Form1()
    {
        InitializeComponent();
        Load += button1_Click;
        Load += button2_Click;;
    }