You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:15:11