跨线程对控件赋值

1.第一种 使用BackgroundWorker组件(推荐使用这个方法)

BackgroundWorker是.NET里面用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作(比如数据库大批量数据获取或者操作)

   private void button1_Click(object sender, EventArgs e)
{
using (BackgroundWorker bw = new BackgroundWorker())
{
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted);
bw.DoWork += new DoWorkEventHandler(DoWork);
bw.RunWorkerAsync("Tank");
}
} /// <summary>
/// 工作方法
/// </summary>
private void DoWork(object sender, DoWorkEventArgs e)
{
// 这里是后台线程, 是在另一个线程上完成的
// 这里是真正做事的工作线程
// 可以在这里做一些费时的,复杂的操作
Thread.Sleep();
e.Result = e.Argument + "工作线程完成";
} /// <summary>
/// 运行工作进程已完成方法
/// </summary>
private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//这时后台线程已经完成,并返回了主线程,所以可以直接使用UI控件了
this.button1.Text = e.Result.ToString();
}

2.第二种 

private void button2_Click(object sender, EventArgs e)
{
Thread thread1 = new Thread(new ParameterizedThreadStart(UpdateLabel2));
thread1.Start("更新Label");
} private void UpdateLabel2(object str)
{
if (label2.InvokeRequired)
{
// 当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它
Action<string> actionDelegate = (x) => { this.label2.Text = x.ToString(); };
// 或者
// Action<string> actionDelegate = delegate(string txt) { this.label2.Text = txt; };
this.label2.Invoke(actionDelegate, str);
}
else
{
this.label2.Text = str.ToString();
}
}

Invoke方法和BeginInvoke方法的区别:
Invoke方法和BeginInvoke方法的区别是
Invoke方法是同步的, 它会等待工作线程完成,
BeginInvoke方法是异步的, 它会另起一个线程去完成工作线程

第2种:

private void button4_Click(object sender, EventArgs e)
{
using (BackgroundWorker bw = new BackgroundWorker())
{
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerAsync("Tank");
}
} void bw_DoWork(object sender, DoWorkEventArgs e)
{
// 这里是后台线程, 是在另一个线程上完成的
// 这里是真正做事的工作线程
// 可以在这里做一些费时的,复杂的操作
Thread.Sleep();
e.Result = e.Argument + "工作线程完成";
} void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//这时后台线程已经完成,并返回了主线程,所以可以直接使用UI控件了
this.label4.Text = e.Result.ToString();
}

最新文章

  1. Android中AIDL的理解与使用(一)——跨应用启动/绑定Service
  2. thinkphp 导出exl功能
  3. ajax异步请求Response.Redirect重定向
  4. python数字图像处理(7):图像的形变与缩放
  5. 在android的spinner中,实现取VALUE值和TEXT值。 ZT
  6. linux实例 批量修改图片文件名
  7. 客户端是选择Java Swing还是C# Winform
  8. MemberwishClone学习
  9. zabbix Lack of free swap space
  10. 【Android】Activity
  11. Sql Server——数据的增删改
  12. Air Raid
  13. 关于C#传给视图的字符串带有Html转义字符的处理
  14. websocket作用及意义
  15. 决策树算法原理(CART分类树)
  16. 软件测试人员必备网络知识(一):什么是cookie?
  17. IDEA添加源码包
  18. 黄聪:安装cnpm替代默认的npm
  19. java设计模式-工厂系列
  20. excel的宏与VBA入门(一)——基础概念

热门文章

  1. 资源池-数据库连接池简单实现-JAVA版本
  2. 重置 Bootstrap modal 模态框数据
  3. DS DI ES SI等等
  4. PHP 输入输出流 php://input 获取表单中2个重名name的值
  5. Ambari深入学习(I)-系统架构
  6. 资料汇总_Gitlab使用记录
  7. MVC学习笔记(一)—用EF创建数据库
  8. 关于使用jquery form submit出现多次提交的问题
  9. AWS--Lamdba
  10. shell截取字符串操作