C#中的YahooFinanceAPI NuGet包出现问题



我在使用YahooFinanceAPI NuGet包时遇到问题。我正在尝试使用这个包获取历史数据,现在我有一个窗口,用户可以在其中放置一些信息,点击按钮后,我想在列表视图中显示历史价格。点击按钮时的程序是:

private async void BtnGetData_Click(object sender, RoutedEventArgs e)
{
DataTable Histo = new DataTable();
foreach (string s in ListCol)
{
DataColumn x = new DataColumn();
x.ColumnName = s;
x.DataType = System.Type.GetType("System.String");
Histo.Columns.Add(x);
}
Symbol = "^FCHI";// Ticker.Text;
StartDate = "21/02/2021";// DD.Text;
EndDate = "21/02/2022"; //DF.Text;
//Histo = DataFromYahoo.GetData(Symbol, StartDate, EndDate);
var awaiter = DataFromYahoo.ReceiveData(Symbol, StartDate, EndDate, Histo);
if (awaiter.Result == 1)
{
foreach (DataRow row in Histo.Rows)
{
foreach (DataColumn col in Histo.Columns)
{
YahooData.Items.Add(row[col].ToString());
}
}
}
}

本部分:

var awaiter = DataFromYahoo.ReceiveData(Symbol, StartDate, EndDate, Histo);

来自我创建的DLL:

public async Task<int> ReceiveData (string Symbol, string DD, string DF, DataTable Result)
{
DateTime StartDate;
DateTime EndDate;
StartDate = ConvertDate(DD);
EndDate = ConvertDate(DF);
var histo = await Yahoo.GetHistoricalAsync(Symbol, StartDate, EndDate,Period.Daily);
DataRow row;
foreach (var candle in histo)
{
row = Result.NewRow();
row["Date"] = candle.DateTime.Date.ToString();
row["Open"] = candle.Open.ToString();
row["High"] = candle.High.ToString();
row["Low"] = candle.Low.ToString();
row["Close"] = candle.Close.ToString();
row["AdjClos"] = candle.AdjustedClose.ToString();
row["Volume"] = candle.Volume.ToString();
Result.Rows.Add(row);
}
return 1;
}

但当代码到达部件时:

var histo = await Yahoo.GetHistoricalAsync(Symbol, StartDate, EndDate,Period.Daily);

它停止时没有任何异常或错误消息。

我从这里得到这个部件

我真的不确定我做错了什么。我也是C#的新手,我不太了解异步方法是如何工作的,所以如果有人能给我一些答案,我会很高兴。谢谢

EDIT:此外,ConvertDate((函数只会将日期从字符串格式转换为DateTime格式,因为它在链接中使用。

您应该等待异步方法:

private async void BtnGetData_Click(object sender, RoutedEventArgs e)
{
DataTable Histo = new DataTable();
foreach (string s in ListCol)
{
DataColumn x = new DataColumn();
x.ColumnName = s;
x.DataType = System.Type.GetType("System.String");
Histo.Columns.Add(x);
}
Symbol = "^FCHI";// Ticker.Text;
StartDate = "21/02/2021";// DD.Text;
EndDate = "21/02/2022"; //DF.Text;
//Histo = DataFromYahoo.GetData(Symbol, StartDate, EndDate);
var awaiter = await DataFromYahoo.ReceiveData(Symbol, StartDate, EndDate, Histo);
if (awaiter == 1)
{
foreach (DataRow row in Histo.Rows)
{
foreach (DataColumn col in Histo.Columns)
{
YahooData.Items.Add(row[col].ToString());
}
}
}
}

"滥用";例如,通过访问阻塞.Result属性的异步代码可能会死锁,这可能就是您在这里遇到的情况。

为什么不直接使用yahoo api(他们仍然支持调用它(。我使用它。请参阅下面的示例函数以获取历史数据

public StringBuilder FetchStockDataOnline(string scriptname, string range, string interval, string indicators = "quote", bool includeTimestamps = true)
{
StringBuilder returnData = null;
string webservice_url = "";
WebResponse wr;
Stream receiveStream = null;
StreamReader reader = null;
try
{
//https://query1.finance.yahoo.com/v7/finance/chart/HDFC.BO?range=2yr&interval=1d&indicators=quote&includeTimestamps=true
webservice_url = string.Format(StockManager.urlGetStockData, scriptname, range, interval, indicators, includeTimestamps);
Uri url = new Uri(webservice_url);
var webRequest = WebRequest.Create(url);
webRequest.Method = "GET";
webRequest.ContentType = "application/json";
wr = webRequest.GetResponseAsync().Result;
receiveStream = wr.GetResponseStream();
reader = new StreamReader(receiveStream);
returnData = new StringBuilder(reader.ReadToEnd());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return returnData;
}

最新更新