posts - 21,comments - 64,views - 25007

参考网上一些资料自己整理的一个工具类,用于异步执行耗时作业,然后回到主线程刷新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   王庭安  阅读(708)  评论(3编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
< 2010年7月 >
27 28 29 30 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1 2 3 4 5 6 7

点击右上角即可分享
微信分享提示