2015-08-17 37 views
-1
public BarchartParser() 
    { 
     // Initialize list 
     StockSymbols = new List<string>(); 

     // Add items 
     ParseBarchart(); 
    } 

这是调用方法解析HTML

private async void ParseBarchart() 
    { 
     try 
     { 
      #region Get Html Document 

      // Get response from site 
      HttpClient http = new HttpClient(); 
      var response = await http.GetByteArrayAsync(BARCHART_WEBSITE); 
      /* Break or W/e happens on this line ^^^ */ 

      // Encode html response to UTF-8 
      string source = Encoding.GetEncoding(BARCHART_ENCODING) 
             .GetString(response, 0, response.Length - 1); 

      // Get html 
      HtmlDocument document = new HtmlDocument(); 
      document.LoadHtml(source); 

      #endregion 

      #region Get Data From Table 

      // Get table containining stock info 
      HtmlNode table = document.DocumentNode.Descendants() 
       .Single<HtmlNode> 
      (
       x => (x.Name == "table") && 
        (x.Attributes["class"] != null) && 
        (x.Attributes["class"].Value.Equals("datatable ajax")) && 
        (x.Attributes["id"].Value.Equals("dt1")) 
      ); 

      // Get 'tbody' element from table 
      HtmlNode tbody = table.Descendants("tbody").FirstOrDefault(); 

      // Get all rows from the table 
      List<HtmlNode> allStocks = tbody.Descendants("tr").ToList(); 

      // For each row, id is "td1_X" where X is the symbol of the stock 
      foreach (HtmlNode row in allStocks) 
      { 
       StockSymbols.Add(row.Attributes["id"].Value.ToString() 
        .Split(new char[] { '_' })[1]); 
      } 

      #endregion 
     } 
     catch 
     { 
      StockSymbols = new List<string>(); 
      StockSymbols.Add("this didn't work"); 
     } 
    } 

而从一个简单的表格应用程序中的代码,使用这个C'tor:

BarchartParser barchartData; 

    public Form1() 
    { 
     InitializeComponent(); 
     barchartData = new BarchartParser(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     if (barchartData.StockSymbols != null && barchartData.StockSymbols.Count > 0) 
      MessageBox.Show(barchartData.StockSymbols[0]); 
     else 
      MessageBox.Show("barchartData.StockSymbols is null or count == 0"); 
     this.Close(); 
    } 

不完全确定这里发生了什么。它工作了一次,我调试,然后停止工作。
此代码是在C'tor期间调用的函数的一部分。当这个抛出或任何发生,
它只是继续到我在调试模式下设置的下一个断点...任何人都有什么线索
可能是这样的原因?

编辑:我知道这不是抛出,因为catch块中的代码不会发生。它只是对

移动只是一般,我按照本指南https://code.msdn.microsoft.com/Parsing-Html-using-C-721be358/sourcecode?fileId=122353&pathId=1834557721

+0

代码如图不足以图个问题。最可能的问题是调用此代码,因为您无法在构造函数中“等待”......请提供相对完整的示例(方法的方法和调用者)以获取答案。 –

+0

根据要求,基本上我写的所有代码到目前为止 –

+0

正如预期的那样,您不是在等待结果 - 请参阅我的答案。 –

回答

0

你是不是await -ing方法async方法,以便只同步部分(基本达到第一个真正的await)将作为您的构造函数调用的一部分来执行,其余部分将在一些任意胎面最终运行(可能使过程在例外的情况下)。

如果您尝试拨打.Result.Wait()await vs Task.Wait - Deadlock?),通常您不能从构造函数调用异常方法,但没有发生死锁的可能性。作为选项,您可以查看Fire-and-forget with async vs "old async delegate"是否适用于您的情况。

正确的修复方法是将异步操作从同步方法(如构造函数)移动到显式异步方法并相应地调用它。

哈克修复(与likley死锁):

public BarchartParser() 
{ 
    ... 
    ParseBarchart().Wait(); 
} 
+0

Spasiba老兄。明天我会确保修好。非常感谢 –

0

当等待语句抛出一个异常,只有一个try块可以抓住它。我建议你添加一个try-catch或try-finally来捕捉异常并正确处理它。

+0

虽然可能的解释OP说 - “这条线不抛出” - 所以它不太可能是这个问题... –

+0

对不起,它包围了一个try-catch。这就是为什么我声明这不是抛砖引玉的原因 –

+0

在这种情况下,在异常设置中启用公共语言异常以捕获应用程序创建的所有异常。事件在尝试块中。可能还有其他更深入的东西会抛出,但在代码 –