C#WinForm:使用 Task.WhenAll 并行执行提高网络取数效率

通过Task.WhenAll ,并行执行请求,获取网络数据的方法。

以下数据为例,效率提示明显。

C#WinForm:使用 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 "|";
          }
      }

© 版权声明

相关文章

暂无评论

none
暂无评论...