刚刚开始学习await/async这两个关键词的使用,以及异步编程,照着例子,用winform写了段测试代码:
1 private async void btnAsync_Click( object sender, EventArgs e ) 2 { 3 textBox1.Text = "点了异步按钮。"; 4 var dt = await ExecuteTableAsync( "select * from Users" ); 5 textBox1.Text += "读取完毕,行数:" + dt.Rows.Count.ToString(); 6 } 7 8 public async Task<DataTable> ExecuteTableAsync(string sql) 9 { 10 DataTable result = null; 11 12 using( SqlConnection conn = new SqlConnection() ) 13 { 14 conn.ConnectionString = "..."; 15 await conn.OpenAsync(); 16 using( SqlCommand cmd = new SqlCommand( sql ) ) 17 { 18 cmd.Connection = conn; 19 using( var dr = await cmd.ExecuteReaderAsync() ) 20 { 21 result = new DataTable(); 22 result.Load( dr ); 23 } 24 } 25 } 26 27 return result; 28 }
为测试效果搞了个10万行数据的表。
我期望的是,点击按钮后,执行到第四行时返回,此时窗体界面是能响应的,比如textbox的光标会继续闪,能拖动等等。
但实际运行起来时,却是界面停止响应的样子。
请问:我的问题出在哪里呢?希望能详细解释一下错误之处,让我能加深对异步编程的理解,谢谢
将
result.Load(dr);
改成
await Task.Run(() =>
{
result.Load(dr);
});
多谢!原来“让所有耗时的操作异步化”的意思,隐含着要先确定代码中耗时的部分的意思,非常感谢!
程序走到下面这一步的时候会,会等待 ExecuteTableAsync 方法执行完,返回结果,所以会卡住。
var dt = await ExecuteTableAsync( "select * from Users" );
多谢!原来“让所有耗时的操作异步化”的意思,隐含着要先确定代码中耗时的部分的意思,非常感谢!