通过Task.WhenAll ,并行执行请求,获取网络数据的方法。
以下数据为例,效率提示明显。
主要代码如下:
private async void 新浪财经数据_Click(object sender, EventArgs e)
{
List<Task<(datagridviewrow row string strdata>> tasks = new List<Task<(datagridviewrow, string>>();
foreach (DataGridViewRow row in this.dataGridView1.Rows)
{
if (row.Cells[0].Value == null) continue;
string strCode = row.Cells[0].Value.ToString();
// 6000036.SH,转换为:sh600036
string[] array = strCode.Split(new char[] { '.' });
if (array.Length < 2) continue;
strCode = array[1].ToLower() + array[0].ToLower();
// 异步请求任务
tasks.Add(GetStockDataTask(row, strCode));
}
// 关键!!
await Task.WhenAll(tasks);
// 更新
foreach (var task in tasks)
{
var result = await task;
string[] arrayData = result.strData.Split(new char[] { '|' });
if (arrayData.Length < 2) continue;
result.row.Cells[2].Value = arrayData[0];
result.row.Cells[3].Value = arrayData[1];
}
}
// 确保取数返回后,可以找到正确的row,并更新之:
async Task<(datagridviewrow, string> GetStockDataTask(DataGridViewRow row, string strCode)
{
string strData = await IWeb.GetStockDataAsync(strCode);
return (row, strData);
}
异步获取网络数据的方法
这个以前也有关于ExcelVBA版本的函数。
输入:sh6000036,获取最新的【交易价格】和【涨跌幅】。
public static async Task GetStockDataAsync(string strCode)
{
string url = "http://qt.gtimg.cn/q=" + strCode;
try
{
using (HttpClient httpClient = new HttpClient())
{
HttpResponseMessage response = await httpClient.GetAsync(url);
if (response.IsSuccessStatusCode)
{
string responseBody = await response.Content.ReadAsStringAsync();
// 查找 "="
int pos = responseBody.IndexOf("=") + 1;
if (pos > 0 && pos < responsebody.length responsebody='responseBody.Substring(pos,' responsebody.length - pos - 1 string resultarray='responseBody.Split('~');' if resultarray.length> 32)
{
return resultArray[3] + "|" + resultArray[32];
}
}
}
return "|";
}
}
catch (Exception)
{
return "|";
}
}