首页 新闻 赞助 找找看

用了await/async,为何界面还是卡住了?

0
悬赏园豆:200 [已解决问题] 解决于 2016-06-16 10:25

刚刚开始学习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的光标会继续闪,能拖动等等。

但实际运行起来时,却是界面停止响应的样子。

请问:我的问题出在哪里呢?希望能详细解释一下错误之处,让我能加深对异步编程的理解,谢谢

showmemoney的主页 showmemoney | 初学一级 | 园豆:4
提问于:2016-06-15 19:18
< >
分享
最佳答案
3

result.Load(dr);

改成

await Task.Run(() =>
{
  result.Load(dr);
});

收获园豆:150
jello chen | 大侠五级 |园豆:7306 | 2016-06-15 23:10

多谢!原来“让所有耗时的操作异步化”的意思,隐含着要先确定代码中耗时的部分的意思,非常感谢!

showmemoney | 园豆:4 (初学一级) | 2016-06-16 10:23
其他回答(2)
0
爱编程的大叔 | 园豆:30839 (高人七级) | 2016-06-15 21:02

多谢哈,这篇看过了,理论和实际的联系总是有点门槛要跨呐……

支持(0) 反对(0) showmemoney | 园豆:4 (初学一级) | 2016-06-16 10:24
3

程序走到下面这一步的时候会,会等待 ExecuteTableAsync 方法执行完,返回结果,所以会卡住。

var dt = await ExecuteTableAsync( "select * from Users" );

 

收获园豆:50
CodeHsu | 园豆:5468 (大侠五级) | 2016-06-15 21:06

多谢!原来“让所有耗时的操作异步化”的意思,隐含着要先确定代码中耗时的部分的意思,非常感谢!

支持(0) 反对(0) showmemoney | 园豆:4 (初学一级) | 2016-06-16 10:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册