TaskCompletionSource
の周りを頭で囲みます。ここに私が同期的に書いた小さなクラスがあります(WebBrowser.Navigate()
は非同期です)。ウェブページをダウンロードして呼び出し元に返します。 TaskCompletionSource
を正しく使用したかどうかはわかりません。誰かが私がここで紛失していることを示してもらえますか、それとも完全に工学的な解決策であるのかを教えてください。WebBrowserコントロール:同期ラッパーの作成
class PageDownloader
{
private WebBrowser _WB = new WebBrowser();
private TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
public PageDownloader()
{
_WB.LoadCompleted += _WB_LoadCompleted;
}
public string Download(string url)
{
_WB.Navigate(new Uri(url));
tcs.Task.Wait();
if (tcs.Task.IsCanceled || tcs.Task.IsFaulted)
return null;
else
return (_WB.Document as mshtml.HTMLDocument).body.innerHTML;
}
private void _WB_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
var docTemp = _WB.Document as mshtml.HTMLDocument;
foreach (mshtml.IHTMLImgElement imgElemt in docTemp.images)
imgElemt.src = "";
tcs.SetResult(true);
}
}
ダウンロード方法が非同期ではないので、実際にそれを待つことができますか? – mm8
@ mm8:いいえ、それはクラスの全体のポイントです。私はそれの "同期"バージョンを作成しようとしている。 – dotNET
次に、WebBrowserコントロールのLoadCompletedイベントを直接処理することはできますか? – mm8