async/await简化多线程调用主界面控件方法

本文探讨了C#5.0中async/await特性如何简化多线程环境下主界面控件的调用,避免了繁琐的跨线程操作,提升代码可读性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

async/await简化多线程调用主界面控件方法

1.C#4.0的做法

C#4.0调用多线程多为Task操作,一般将耗时的工作交给后端线程去做,主线程只需要保持数据更新就行了。后端线程无法直接控制主界面的线程,一般是通过调用主界面的句柄,Invoke/BeginInvoke这两个方法,一个同步,一个异步方法。这样会导致很多不方便的地方。这里展示一个示例:

        private void  btn_Click(object sender, EventArgs e)
        {
            Task.Run(() =>
            {
                string url = "https://www.baidu.com/";
                this.Invoke((Action)(() => this.btnAsync.Enabled = false));
                using (var client = new HttpClient())
                {
                    client.GetStringAsync(url);
                }
                this.Invoke((Action)(() => this.btnAsync.Enabled = true));
            });
        }

可以看到在后台线程中多次与主线程相互交叉,增加编程难度。

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

2C#5.0中的异步

C#5.0的这个主要特性基于TPL,因此可以在适用于异步的地方编写同步形式的代码。它包含一个新的语言构造,可以await等待一个异步的操作,但实际上它并没有阻塞当前执行线程。当程序运行到await时,会立即返回调用者,等到task结束时,调用task后面的代码,控件之间的跨线程调用也没有了。

        async private void btnAsync_Click(object sender, EventArgs e)
        {
            this.btnAsync.Enabled = false;
            Task task = Task.Run(async () =>
              {
                  string url = "https://www.baidu.com/";
                  using (var client = new HttpClient())
                  {
                      await client.GetStringAsync(url);
                  }
              });
            await task;
            this.btnAsync.Enabled = true;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值