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

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

编码文章call10242025-03-06 11:48:4938A+A-

通过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 "|";
          }
      }

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4