2013-03-12 67 views
1

所以我很困惑,为什么我的WebClient没有访问它的DownloadStringCompleted。在读完WebClient正在disposed的可能问题后,才能完成下载。或者exceptionsDownloadData期间未被捕获,或者简单地Uri无法访问。WebClient()永远不会到达WPF应用程序的DownloadStringCompleted

我检查了所有这些问题,并且我的WebClient尚未访问其DownloadStringCompleted

PMID 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任何想法?

回答

1

您的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); 
} 
相关问题