C#多线程操作控件的两种安全方式(委托方式和BackgroundWorker控件方式)
2010-05-29 00:11
330 查看
实现的功能是
1、按button2之后,label2会每100毫秒显示一次数字,数字从0到99。(委托方式实现)
2、按button3之后,模拟耗时操作5秒后label3显示为当前时间。(BackgroundWorker方式实现)
3、在1、2执行的时候,按button1可以将label1的内容改为textbox1的内容。(此处为主线程控制,用于显示多线程未死锁主线程)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private delegate void SetState(int x);//代理 public Form1() { InitializeComponent(); Thread.CurrentThread.Name = "Main";//主线程命名 Console.WriteLine(Thread.CurrentThread.Name); } private void TempFunction() //中转函数,用来连续多次调用目标函数并模拟延时 { for (int i = 0; i < 100;i++ ) { ThreadFunction(i); Thread.Sleep(100); } } private void ThreadFunction(int x) //实际控件操作函数 { if (label2.InvokeRequired) //用委托来操作 { SetState ss = new SetState(ThreadFunction); Invoke(ss,new object[]{x}); Console.WriteLine(Thread.CurrentThread.Name); } else //普通方式操作 { label2.Text = x.ToString(); label2.Update(); Console.WriteLine(Thread.CurrentThread.Name); } } private void button1_Click(object sender, EventArgs e) //主线程的按钮操作,用来显示区别所在 { label1.Text = textBox1.Text; } private void button2_Click(object sender, EventArgs e) //按下按钮后开始多线程操作 { Thread th1 = new Thread(new ThreadStart(TempFunction)); th1.IsBackground = true; th1.Name = "kidfruit"; th1.Start(); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) //使用BackgroundWorker控件 { Thread.Sleep(5000); //模拟操作延时 } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) //BackgroundWorker耗时操作结束后 { label3.Text = DateTime.Now.ToLongTimeString(); } private void button3_Click(object sender, EventArgs e) //开始BackgroundWorker的耗时操作 { backgroundWorker1.RunWorkerAsync(); } } }
相关文章推荐
- C#多线程操作控件的两种安全方式(委托方式和BackgroundWorker控件方式)
- c#非委托方式在子线程里操作UI控件(实际上运算逻辑在子线程,更新还是在主线程,解决了UI界面无响应的问题)
- C# 在自定义线程中采用系统委托方式操作主窗体线程控件的方法
- 两种方式效果一样。基于控件操作。
- (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。
- C# 采用系统委托的方式处理线程内操作窗体控件(转载)
- WinForms程序使用委托(Invoke)的方式操作界面的控件
- 学习笔记_JavaSE_23_多线程的两种方式、安全问题、锁机制
- vs2005的form的委托 实现多线程操作richedit控件显示消息
- Java 中的多线程-两种创建方式,定时器的应用,线程的安全问题可以用银行转账来说明
- C# 采用系统委托的方式处理线程内操作窗体控件
- 多线程的安全问题。 创建线程的两种方式区别
- C# 采用系统委托方式处理线程内操作窗体控件
- C# 采用系统委托的方式处理线程内操作窗体控件
- 多线程中 用委托 操作 窗体的控件
- 关于多线程委托的控件操作
- 黑马程序员—多线程的两种创建方式与多线程安全问题
- C# 采用系统委托的方式处理线程内操作窗体控件
- Java多线程13:读写锁和两种同步方式的对比
- java例程练习(多线程的两种创建方式)