.NET中的异步

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

using System.Windows.Forms;

 

namespace asyncForm

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

            ///点击触发事件

            this.btnstart.Click += new System.EventHandler(btnstart_Click);

        }

        public async void btnstart_Click(object sender, EventArgs e)

        {

            /// <summary>

            /// 这里可以采用继承IProgress<T>接口的方式来实现 这里我采用lamda表达式实现的匿名委托来实现 这是实时状态返回时的回调

            /// </summary>

            IProgress<int> callBack = new Progress<int>(state =>

            {

                //设置进度条的进度啦

                pbstate.Value = state;

                btnstart.Text = state + "%";

            });

            this.btnstart.Text = await Task.Run(() =>

            {

                return bigWork(callBack);

            });

 

        }

 

 

        /// <summary>

        /// 这里加入一个做艰难工作的异步方法

        /// </summary>

        /// <returns></returns>

        private string bigWork(IProgress<int> callBack)

        {

            Random rn = new Random();

            for (int i = 1; i < 11; i++)

            {

                Thread.Sleep(rn.Next(10) * 1000);

                callBack.Report(i * 10);

            }

            return "Hello";

        }

 

    }

}

 

Net的异步任务处理步骤如下:

1. 将一个高耗时耗资源的操作放在一个普通方法中

2. 实现一个实现IProgress<T>接口的对象,其中T为在实时回调过程中回传的数据 ,我们大多来用作状态信息,在回调的Report方法中加入对于当前状态的响应代码,如进度条的改变等等。

申明一个异步方法或者事件(使用async关键字),利用

await Task.Run(() =>

            {

                return bigWork(callBack);

            });

3. 来执行大量耗时的操作。如果你需要得到异步方法的返回值可以使用

this.btnstart.Text = await Task.Run(() =>

            {

                return bigWork(callBack);

            });

来得到返回值。

 

 

posted @ 2016-03-26 10:49  迪斯高  阅读(217)  评论(0编辑  收藏  举报