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

C# WPF:如何将同步数据库查询改为Async/Await填充DataGrid

异步修改方案及代码示例

核心修改要点

  • 替换同步IO操作为MySQL异步API,配合async/await实现非阻塞查询,避免UI卡顿
  • 修复原代码的SQL注入风险,改用参数化查询
  • 利用await自动捕获UI线程上下文,确保安全更新DataGrid

修改后的完整代码

// 注意:包含这段代码的方法需要标记为async(比如按钮点击事件)
private async void LoadItemDataAsync()
{
    using MySqlConnection con = new(Common.JOIN);
    // 异步打开数据库连接
    await con.OpenAsync();

    // 使用参数化查询,彻底避免SQL注入
    string query = "SELECT * FROM item WHERE CONCAT(`i_type`) LIKE @SearchType ORDER BY `i_name` ASC;";
    MySqlCommand cmd = new(query, con);
    // 添加参数,LIKE查询需要通配符(如果原业务需要模糊匹配的话)
    cmd.Parameters.AddWithValue("@SearchType", $"%{type.Text}%");

    MySqlDataAdapter adp = new(cmd);
    DataSet ds = new();
    // 异步填充DataSet
    await adp.FillAsync(ds, "LoadDataBinding");

    // await会自动回到UI线程,直接设置DataContext即可
    datagrid.DataContext = ds;
}

关键细节说明

  1. 方法标记:包含这段代码的方法必须加上async修饰符,若为UI事件处理方法(如按钮点击)返回async void,其他场景建议返回async Task
  2. 异步API使用:所有涉及IO的操作都替换为异步版本:OpenAsync()替代Open(),FillAsync()替代Fill(),并通过await等待操作完成
  3. SQL注入防护:原代码直接拼接用户输入type.Text是高危行为,参数化查询将输入作为参数传递,而非直接嵌入SQL语句,彻底杜绝注入风险
  4. UI线程安全:await会自动捕获WPF的UI线程上下文,所以填充完成后可以直接更新DataGrid的DataContext,无需额外调用Dispatcher

内容的提问来源于stack exchange,提问作者Duckey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:20:48