用async-await异步编程代替BackgroundWorker来异步执行耗时操作

15 篇文章 0 订阅
6 篇文章 0 订阅

在MSDN上看到一句话:

The async-based approach to asynchronous programming is preferable to existing approaches in almost every case. In particular, this approach is better than the BackgroundWorker class for I/O-bound operations because the code is simpler and you don't have to guard against race conditions.

(几乎所有情况下,基于async的异步编程方式要优于现有的方式。特别是,在I/O绑定操作中,相比于BackgroundWorker类,async异步编程方式的代码更简单,且无需避免争用条件)

参考:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/index

鉴于之前一直用的BackgroundWorker类来异步完成UI上的耗时操作,便想着改用await方式,看下效果。(其实很简单。。)

1.先写一个简单的通过BackgroundWorker实现异步耗时操作的例子, 

程序模拟的效果是:窗体加载时,异步耗时操作(5秒)中获取一个字符串;然后UI线程将异步操作中获得的值赋给TextBox用于界面显示。

public partial class Form1 : Form
    {
        //m_text为界面上的一个文本框控件

        private BackgroundWorker m_backgroundWorker = new BackgroundWorker();
        private string m_stringValue;

        public Form1()
        {
            InitializeComponent();
            m_backgroundWorker.DoWork += AsyncWork;
            m_backgroundWorker.RunWorkerCompleted += AsyncWorkCompleted;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            if (!m_backgroundWorker.IsBusy)
            {
                m_backgroundWorker.RunWorkerAsync();
            }
        }

        private void AsyncWork(object sender, DoWorkEventArgs e)
        {
            Thread.Sleep(5000);//模拟一个耗时操作

            m_stringValue = "异步操作中获取的字符串值";
        }

        private void AsyncWorkCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            m_text.Text = m_stringValue;
        }
    }

2.改成await方式:

 

public partial class Form1 : Form
    {
        //m_text为界面上的一个文本框控件
        private string m_stringValue;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            BindingTextValue();
        }

        private async void BindingTextValue()
        {
            await Task.Run(() => 
            {
                Thread.Sleep(5000);//模拟一个耗时操作

                m_stringValue = "异步操作中获取的字符串值";
            });

            m_text.Text = m_stringValue;
        }
    }

对比两种写法,async-await方式的确简单,MSDN诚不我欺啊。

还有一个注意点:async-await异步编程是.NET Framework 4.5才有的,而BackgroundWorker在.NET Framework 2.0就已经有了。如果要在XP的.NET Framework4.0版本上使用,需要在NuGet下载微软提供的Microsoft.Bcl.Async包,且只支持XP SP3,并且需要下载补丁KB2468871

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值