试图围绕我的头围绕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