Winform程序中使用await/async实现异步获取数据

Winform程序(4.0以上)异步获取数据时常用的方法可能如下:


private void button3_Click(object sender, EventArgs e)
        {
            DataTable dt = null;
            Task.Factory.StartNew(() =>
            {
                dt = new DataTable();
                dt.Columns.Add("id", typeof(int));
                dt.Columns.Add("name");

                for (int i = 0; i < 10000; i++)
                {
                    dt.Rows.Add(new object[] { i, "name" + i.ToString() });
                }
                Thread.Sleep(5000);
                this.Invoke((EventHandler)delegate
                {
                    this.dataGridView1.DataSource = dt;
                });
            });
        }

传统方法也比较一目了然,但既然有了await/async,我们应该优先使用await/async,毕竟其它语言(js,c++)现在也都提供了await/async语法,习惯了await/async写法,在写前后端的数据异步处理时会容易上手。下面代码基于.net framework4.6.1实现

private void button2_Click(object sender, EventArgs e)
        {
            //由于.net461的Button控件没有实现 ISynchronizeInvoke接口,所以要用下面的代码过渡一下
            _ = AsyncFunc();
        }

        async Task AsyncFunc()
        {
            DataTable dt = await FecthData();
            this.dataGridView1.DataSource = dt;
        }

        async Task<DataTable> FecthData()
        {
            DataTable dt=null;
            await Task.Run(() =>
            {
                dt = new DataTable();
                dt.Columns.Add("id", typeof(int));
                dt.Columns.Add("name");

                for (int i = 0; i < 10000; i++)
                {
                    dt.Rows.Add(new object[] { i, "name" + i.ToString() });
                }
                Thread.Sleep(5000);
            });
            return dt;
        }

为了便于理解,我们可以简单认为 await 就是个代码执行分裂点,本例中当执行到下面的代码时:

await Task.Run(() =>

主线程会启动线程池中线程执行 Task.Run中的Action,并且编译器会在这里打一个“标记”点,Action代码执行完毕后线程池中线程会通知主线程到“标记”点继续向下执行。
js是单线程模式,用promise实现了async/await,但是用c#的实现方法去理解js的async/await的执行顺序也是没有问题的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值