C#WinForm:使用 Task.WhenAll 并行执行提高网络取数效率
通过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<string> 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 "|";
}
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...

