ここで扱っているのは、本質的に非同期のメソッドを同期的に呼び出そうとしていることです。
DocumentCompleted
使用しない理由は、そのイベントを他の目的に使用する必要があるという質問へのコメントで述べたように、イベントを使用することをお勧めします。DocumentCompleted
プライベート クラスのブール値フラグと組み合わせて、これがかどうかの特殊なケースですDocumentCompleted
。
private bool wbNeedsSpecialAction; //when you need to call the special case of Navigate() set this flag to true
public Form1()
{
InitializeComponent();
wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
}
void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (wbNeedsSpecialAction)
{
richtextdocument.Text = wb.DocumentText;
wbNeedsSpecialAction = false;
}
else
{
//other cases of using DocumentCompleted...
}
}
public void Browse()
{
wbNeedsSpecialAction = true; //make sure the event is treated differently
wb.Navigate("http://www.google.com");
}
これにより、イベント ハンドラー内で他のケースを制御できます。
この「特別なアクション」ページの読み込みが完了するNavigate()
前に、ユーザーが別の呼び出しをトリガーできないように、特別な注意を払う必要があります。そうしないと、特別なケースのイベントが盗まれる可能性があります。1 つの方法は、ページの読み込みが完了するまで UI をブロックすることです。次に例を示します。
Cursor.Current = Cursors.WaitCursor;