C#await& Task.Run

时间:2015-08-10 13:36:55

标签: c# async-await

     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)。似乎等待不起作用 任何人都可以帮忙??

     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);
     }

2 个答案:

答案 0 :(得分:1)

导航开始下载。它在下载完成之前返回。您将不得不等待事件WebBrowser.DocumentCompleted

顺便说一句,因为Navigate不会等到加载它很快,所以不需要异步调用它,否则微软会像在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);
}

答案 1 :(得分:0)

如果您希望 button1 button1 事件上自动执行,那么您可以使用 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);
 }

如果您想要一起工作,那么您可以使用加载事件

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