在C#中解析HTML使用GetByteArrayAsync有困难
不太清楚这里发生了什么。我调试了它一次后它就停止工作了。在C#中解析HTML使用GetByteArrayAsync有困难,c#,html,C#,Html,不太清楚这里发生了什么。我调试了它一次后它就停止工作了。 此代码是在C'tor期间调用的函数的一部分。当抛出或发生任何情况时, 它只是继续到我在调试模式下设置的下一个断点。。。任何人都有什么线索 可能是这个原因吗 编辑:我知道这不是抛出,因为catch块中的代码不会发生。它只是继续前进 一般来说,我遵循本指南当等待语句引发异常时,只有try块才能捕获它。我建议您添加一个try-catch或try-finally来捕获异常并正确地处理它。您不是await-ingasync方法,所以只有方法的同步部
此代码是在C'tor期间调用的函数的一部分。当抛出或发生任何情况时,
它只是继续到我在调试模式下设置的下一个断点。。。任何人都有什么线索
可能是这个原因吗 编辑:我知道这不是抛出,因为catch块中的代码不会发生。它只是继续前进
一般来说,我遵循本指南当等待语句引发异常时,只有try块才能捕获它。我建议您添加一个try-catch或try-finally来捕获异常并正确地处理它。您不是
await
-ingasync
方法,所以只有方法的同步部分(基本上是第一个realawait
)将作为构造函数调用的一部分执行,其余部分最终将以任意方式运行(如果出现异常,可能会导致进程停止)
通常,如果您尝试调用.Result
或.Wait()
(),则无法从构造函数中调用异步方法,否则会出现死锁。作为一个选项,您可以查看是否适用于您的案例
正确的解决方法是将异步操作从同步方法(如构造函数)移动到显式异步方法,并相应地调用它
Hacky fix(带有likley死锁):
显示的代码不足以解决问题。最可能的问题是调用此代码,因为您无法在构造函数中等待。。。请提供相对完整的示例(方法和方法调用方)以获得答案。根据请求,基本上所有我编写的代码都没有等待结果-请参阅我的答案。虽然可能的解释OP说“这行没有抛出”-因此不太可能出现问题…很抱歉没有包括它,它被一个试捕器包围着。这就是为什么我声明,在本例中,在异常设置中启用公共语言异常以捕获应用程序创建的所有异常不是一个简单的方法。在try块中设置这些事件。可能还有其他更深层次的东西抛出,但在这段代码之前我检查了VS设置中的公共语言,但什么也没找到。Spasiba dude。我明天有空的时候一定要把它修好。谢谢
public BarchartParser()
{
// Initialize list
StockSymbols = new List<string>();
// Add items
ParseBarchart();
}
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");
}
}
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();
}
public BarchartParser()
{
...
ParseBarchart().Wait();
}