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

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

{
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;
}
});
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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,谁才是开发者新宠?