参考网上一些资料自己整理的一个工具类,用于异步执行耗时作业,然后回到主线程刷新UI属性

 

 

代码
using System;
using System.Windows.Forms;

namespace Gren.AsyncDemo

    /// <summary>
    /// 异步操作的工具类
    /// </summary>
    public class AsyncUtils<T>
    {
        /// <summary>
        /// 状态对象
        /// </summary>
        private AsyncState<T> state;

        /// <summary>
        /// 异步操作状态对象
        /// </summary>
        public AsyncState<T> State
        {
            get { return this.state; }
        }

 

        /// <summary>
        /// 控件对象
        /// </summary>
        public Control Control { get; set; }

 

        /// <summary>
        /// 异步操作
        /// </summary>
        public Action<AsyncState<T>> AsyncOperation { get; set; }

 

        /// <summary>
        /// 异步操作的回调方法
        /// </summary>
        public Action<AsyncState<T>> AsyncOperationCallback { get; set; }

 

        /// <summary>
        /// 构造函数
        /// </summary>
        public AsyncUtils()
        {
            this.state = new AsyncState<T>();
        }

 

        /// <summary>
        /// 开始执行异步操作
        /// </summary>
        public void BeginInvoke()
        {
            this.state.Error = null;

            if (this.Control != null && this.AsyncOperation != null)
            {
                this.AsyncOperation.BeginInvoke(this.state, new AsyncCallback(this.InvokeCallback), null);
            }
        }

 

        /// <summary>
        /// 执行异步操作的回调方法
        /// </summary>
        private void InvokeCallback(IAsyncResult ar)
        {
            try
            {
                this.AsyncOperation.EndInvoke(ar);
            }
            catch (Exception ex)
            {
                this.state.Error = ex;
            }

            if (this.AsyncOperationCallback != null)
            {
                if (this.Control.InvokeRequired)
                {
                    this.Control.Invoke(this.AsyncOperationCallback, this.state);
                }
                else
                {
                    this.AsyncOperationCallback(this.state);
                }
            }

        }

 

        /// <summary>
        /// 执行异步操作(静态方法)
        /// </summary>
        public static void Invoke(Control control, Action<AsyncState<T>> asyncOperation, Action<AsyncState<T>> asyncOperationCallback)
        {
            AsyncUtils<T> utils = new AsyncUtils<T>();
            utils.Control = control;
            utils.AsyncOperation = asyncOperation;
            utils.AsyncOperationCallback = asyncOperationCallback;
            utils.BeginInvoke();
        }
    }

 

    /// <summary>
    /// 异步操作状态类
    /// </summary>
    public class AsyncState<T>
    {
        /// <summary>
        /// 异步操作异常对象
        /// </summary>
        public Exception Error { get; set; }

        /// <summary>
        /// 状态对象
        /// </summary>
        public T Data { get; set; }

    }

}

 

 

 

使用方法

 

Forms窗体中的代码,请自行添加一个button1,三个textBox

 

 

代码
        private void button1_Click(object sender, EventArgs e)
        {
            

            AsyncUtils<string>.Invoke(
                this,

                //线程方法
                state =>
                {
                    System.Threading.Thread.Sleep(3000);
                    state.Data = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                },
                //回调方法
                state => {
                    if (state.Error != null)
                    {
                        textBox1.Text = state.Error.Message;
                    }
                    else
                    {
                        textBox1.Text = state.Data;
                    }
                });

 

            AsyncUtils<string>.Invoke(
                this,

                //线程方法
                state =>
                {
                    System.Threading.Thread.Sleep(3000);
                    state.Data = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                },

                //回调方法
                state =>
                {
                    if (state.Error != null)
                    {
                        textBox2.Text = state.Error.Message;
                    }
                    else
                    {
                        textBox2.Text = state.Data;
                    }
                });

 

            AsyncUtils<string>.Invoke(
                this,

                //线程方法
                state =>
                {
                    System.Threading.Thread.Sleep(3000);
                    throw new Exception("一个错误!");  //故意抛出一个错误
                },

                //回调方法
                state =>
                {
                    if (state.Error != null)
                    {
                        textBox3.Text = state.Error.Message;
                    }
                    else
                    {
                        textBox3.Text = state.Data;
                    }
                });


        }

 

 

 

posted on 2010-07-17 00:30  王庭安  阅读(706)  评论(3编辑  收藏  举报