WebClient()在WPF应用程序上从未达到DownloadStringCompleted
本文关键字:程序上 未达到 DownloadStringCompleted 应用程序 应用 WPF WebClient | 更新日期: 2023-09-27 18:03:41
所以我很困惑,为什么我的WebClient
没有访问它的DownloadStringCompleted
。在阅读WebClient
被disposed
可能存在的问题后,才能完成下载。或者exceptions
在DownloadData
期间没有被捕获,或者仅仅是Uri
无法访问。
我已经检查了所有这些问题,我的WebClient
还没有访问它的DownloadStringCompleted
。
WebClient类
/// <summary>
/// Construct a new curl
/// </summary>
/// <param name="pmid">pmid value</param>
public PMIDCurl(int pmid)
{
this.pmid = pmid;
StringBuilder pmid_url_string = new StringBuilder();
pmid_url_string.Append("http://www.ncbi.nlm.nih.gov/pubmed/").Append(pmid.ToString()).Append("?report=xml");
this.pmid_url = new Uri(pmid_url_string.ToString());
}
/// <summary>
/// Curl data from the PMID
/// </summary>
public void CurlPMID()
{
WebClient client = new WebClient();
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(HttpsCompleted);
client.DownloadData(this.pmid_url);
}
/// <summary>
/// Information to store in the class after the curl
/// </summary>
public string AbstractTitle { get; set; }
public string AbstractText { get; set; }
/// <summary>
/// Retrieve the data from an xml file about a PMID
/// </summary>
/// <param name="sender">System Generated</param>
/// <param name="e">System Generated</param>
private void HttpsCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
PMIDCrawler pmc = new PMIDCrawler(e.Result, "/pre/PubmedArticle/MedlineCitation/Article");
//iterate over each node in the file
foreach (XmlNode xmlNode in pmc.crawl)
{
this.AbstractTitle = xmlNode["ArticleTitle"].InnerText;
this.AbstractText = xmlNode["Abstract"]["AbstractText"].InnerText;
}
}
} //close httpsCompleted
PMID节点列表构造函数类
/// <summary>
/// List initialized by crawer
/// </summary>
public XmlNodeList crawl { get; set; }
/// <summary>
/// Constructor for the HTML to XML converter
/// </summary>
/// <param name="nHtml"></param>
/// <param name="nodeList"></param>
public PMIDCrawler(string nHtml, string nodeList)
{
//parse it from e
string html = HttpUtility.HtmlDecode(nHtml);
XDocument htmlDoc = XDocument.Parse(html, LoadOptions.None);
//convert the xdocument to an xmldocument
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(htmlDoc.CreateReader());
//load the xmlDocument into a nodelist
XmlElement xmlRoot = xmlDoc.DocumentElement;
this.crawl = xmlRoot.SelectNodes(nodeList);
}
关于为什么DonwloadStringCompleted
从来没有达到任何想法?
您的CurlPMID
代码有几个问题。我在下面的代码中添加了注释。
public void CurlPMID()
{
// 1. The variable 'client' loses scope when this function exits.
// You may want to consider making it a class variable, so it doesn't
// get disposed early.
WebClient client = new WebClient();
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(HttpsCompleted);
// 2. You are calling the synchronous version of the download function.
// The synchronous version does not call any completion handlers.
// When the synchronous call returns, the download has completed.
// 3. You are calling the wrong function here. Based on your completion handler,
// you should be calling DownloadStringAsync(). If you want synchronous
// behavior, call DownloadString() instead.
client.DownloadData(this.pmid_url);
}
简而言之,假设您想要异步行为,您的CurlPMID
函数应该看起来像:
public void CurlPMID()
{
WebClient client = new WebClient();
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(HttpsCompleted);
client.DownloadStringAsync(this.pmid_url);
}