WebForm按钮点击事件for循环内Async异步函数执行后价格未更新问题咨询
问题修复方案
问题根因
- 异步方法中错误使用
ConfigureAwait(false):Web Form依赖ASP.NET同步上下文管控请求生命周期,ConfigureAwait(false)会让await后的代码脱离原上下文执行,循环场景下多次await极易出现上下文丢失、请求生命周期提前结束的问题,单条请求触发概率低所以Button2可正常运行。 - 数据库连接未手动释放:
DB_GetItemPrice方法中的DbConnection未做释放,多次迭代场景下可能出现连接泄漏、数据读取异常。 - 部分场景下未开启页面异步支持:Web Form的异步事件处理需要页面显式开启异步配置,否则异步操作执行状态不受管控。
- 未校验API返回的业务状态:仅确认API有返回无法确认更新操作是否执行成功,很多时候API返回的是参数错误、限流拒绝等失败响应。
修复方案
1. 移除不必要的ConfigureAwait(false)
修改SendRequestAsync方法中的等待逻辑:
private async Task<string> SendRequestAsync(DataRow dr) { string OrderID = ((long)dr["OrderID"]).ToString(); string GoodsID = ((long)dr["GoodsID"]).ToString(); string NewPrice = ((long)dr["NewPrice"]).ToString(); Debug.WriteLine($"{OrderID} , {GoodsID} , {NewPrice}"); string APICall = "myAPIAdress?Param0=" + GoodsID + "," + 3 + "," + NewPrice + "," + 1 + "," + OrderID + ",,"; using (var wc = new System.Net.WebClient()) { // 移除ConfigureAwait(false),保留ASP.NET同步上下文 return await wc.DownloadStringTaskAsync(APICall); } }
2. 优化Button1的循环逻辑
避免重复访问Task.Result,同时增加返回值校验:
protected async void Button1_Click(object sender, EventArgs e) { dt = DB_GetItemPrice(); if (dt == null || dt.Rows.Count == 0) return; for (int i = 0; i < dt.Rows.Count; i++) { string apiResult = await SendRequestAsync(dt.Rows[i]); // 可在此处添加API业务状态判断,比如校验返回结果是否为成功标识 Debug.WriteLine($"第{i+1}条请求,返回结果:{apiResult}"); } }
3. 释放数据库连接资源
修改DB_GetItemPrice方法,用using包裹连接对象避免泄漏,同时补全SQL查询字段:
protected DataTable DB_GetItemPrice() { var db = PSystem.DataHelp.Database.Application; using (var con = new DbConnection(db, ConnectionState.Open)) { // 补全SELECT后的查询字段,避免无字段返回异常 var st = "SELECT OrderID,GoodsID,NewPrice FROM item_discount "; var cmd = new PSystem.DataHelp.DbCommand(st, con); using (var reader = cmd.ExecuteReader()) { var dt = PSystem.DataHelp.DbManager.GetDataTable(reader); return dt?.Rows.Count > 0 ? dt : null; } } }
4. 开启页面异步支持
在对应aspx页面的头部Page指令中添加Async="true"配置,是Web Form支持异步事件的必要前提:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="YourPage.aspx.cs" Inherits="YourNamespace.YourPage" Async="true" %>
内容的提问来源于stack exchange,提问作者Can Lo
相关产品推荐
相关产品推荐

