当你需要通过一个耗时操作获取到数据,并改变窗体或控件的显示时,该工具可以为你解决窗体假死,以及跨线程“线程间操作无效: 从不是创建控件“”的线程访问它。”的问题。
在我的项目中实际使用:
//多线程工具
this.TaskRun(cross =>
{
//多线程代码,请求API
List<EmpType> types = ApiRoutes.EmpApi.GetTypeList(out string msg);
//跨线程代码块
cross.Invoke(delegate
{
uiDataGridView1.DataSource = types;
uiDataGridView1.Refresh();
});
});
你只需要创建如下工具类:
public static class TaskEx
{
/// <summary>
/// 启动多线程
/// </summary>
public static void TaskRun(this System.Windows.Forms.Control ctrl, Action<Action<Action>> action)
{
System.Threading.ThreadPool.QueueUserWorkItem(delegate
{
action.Invoke(b => ctrl.Invoke(b));
});
}
}