8

私は.net4.0を使用しており、非同期メソッドを使用してDocumentCompletedイベントが完了し、値を返すのを待つ方法を理解しようとしました。私の元のコードは上にありますが、このシナリオで非同期/待機モデルに変換するにはどうすればよいですか?

private class BrowserWindow
    {
        private bool webBrowserReady = false;
        public string content = "";


        public void Navigate(string url)
        {

            xxx browser = new xxx();

            browser.DocumentCompleted += new EventHandler(wb_DocumentCompleted);
            webBrowserReady = false;
            browser.CreateControl();
            if (browser.IsHandleCreated)
                browser.Navigate(url);


            while (!webBrowserReady)
            {
                //Application.DoEvents(); >> replace it with async/await 
            }

        }

        private void wb_DocumentCompleted(object sender, EventArgs e)
        {
            try
            {
               ...

                  webBrowserReady = true;

                  content = browser.Document.Body.InnerHtml;

            }
            catch
            {

            }

        }

        public delegate string AsyncMethodCaller(string url);
    }
4

2 に答える 2

12

DocumentCompletedそのため、イベントが発生したときにタスクを返すメソッドが必要です。特定のイベントで必要なときはいつでも、次のようなメソッドを作成できます。

public static Task WhenDocumentCompleted(this WebBrowser browser)
{
    var tcs = new TaskCompletionSource<bool>();
    browser.DocumentCompleted += (s, args) => tcs.SetResult(true);
    return tcs.Task;
}

それを取得したら、次を使用できます。

await browser.WhenDocumentCompleted();
于 2013-02-12T16:16:50.733 に答える