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; }
关键细节说明
- 方法标记:包含这段代码的方法必须加上
async修饰符,若为UI事件处理方法(如按钮点击)返回async void,其他场景建议返回async Task - 异步API使用:所有涉及IO的操作都替换为异步版本:
OpenAsync()替代Open(),FillAsync()替代Fill(),并通过await等待操作完成 - SQL注入防护:原代码直接拼接用户输入
type.Text是高危行为,参数化查询将输入作为参数传递,而非直接嵌入SQL语句,彻底杜绝注入风险 - UI线程安全:
await会自动捕获WPF的UI线程上下文,所以填充完成后可以直接更新DataGrid的DataContext,无需额外调用Dispatcher
内容的提问来源于stack exchange,提问作者Duckey
相关产品推荐
相关产品推荐

