跨线程访问可视化控件(方法一)
来源:互联网 发布:越狱用什么软件好 编辑:程序博客网 时间:2024/05/14 19:21
问题:由于可视化控件是由主线程创建,.NET中规定“不能跨线程直接访问可视化控件”。
跨线程访问可视化控件方法一:利用Control类提供的Invoke()方法,其定义为:
public Object Invoke(Delegate method)
实施步骤:
(1)定义一个访问控件的函数
(2)根据所定义的函数类型自定义一个对应的委托
(3)申明一个委托类型的字段,并与访问控件的函数挂接
(4)编写一个线程函数,在该函数中调用控件对象的Invoke()方法,并将委托字段作为Invoke方法的参数
(5)创建并启动线程
实例(以Label控件为例)
代码实现:
public partial class Form1 : Form
{
//申明一个不带参数的委托
private delegate void setLabelTextDelegate1();
private static setLabelTextDelegate1 setText1;
//申明带有一个参数的委托
private delegate void setLabelTextDelegate2(string strText);
private static setLabelTextDelegate2 setText2;
public Form1()
{
InitializeComponent();
//将函数与对应委托挂接
setText1 = setLableText1;
setText2 = setLableText2;
}
/// <summary>
/// 不带参数的setLableText函数
/// </summary>
private void setLableText1()
{
label1.Text = "跨线程访问label控件";
}
/// <summary>
/// 不带参数的线程函数
/// </summary>
private void ThreadMethod1()
{
label1.Invoke(setText1);
}
/// <summary>
/// 带一个参数的setLableText函数
/// </summary>
/// <param name="strText"></param>
private void setLableText2(string strText)
{
label1.Text = strText;
}
/// <summary>
/// 带一个参数的线程函数
/// </summary>
/// <param name="obj"></param>
private void ThreadMethod2(object obj)
{
label1.Invoke(setText2, new object[] { obj.ToString()});
}
/// <summary>
/// 调用无参数的线程函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_VisitLable1_Click(object sender, EventArgs e)
{
Thread th1 = new Thread(new ThreadStart(ThreadMethod1));
th1.Start();
}
/// <summary>
/// 调用有参数的线程函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_VisitLable2_Click(object sender, EventArgs e)
{
Thread th2 = new Thread(new ParameterizedThreadStart(ThreadMethod2));
th2.Start(tb_infomation.Text);
}
- 跨线程访问可视化控件(方法一)
- .net 跨线程访问可视化控件的基本方法:
- c#之多线程 (跨线程访问可视化控件)
- 跨线程访问控件
- 跨线程访问控件
- C#一种不安全的方法跨线程访问控件
- Winform 跨线程访问控件的两个方法总结
- 线程访问窗体的控件方法
- C#线程间操作无效(跨线程访问控件)
- 跨线程访问窗体控件
- 跨线程的控件访问
- 如何跨线程访问控件
- 如何跨线程访问控件
- .NET跨线程访问控件
- 跨线程访问webBrowser控件
- C# 跨线程访问控件
- 跨线程访问window控件
- c#跨线程访问控件
- 栈
- 走向“持续部署”
- Oracle-内存结构
- Application应用框架思考(一)
- Java命名规范
- 跨线程访问可视化控件(方法一)
- DateTime类常用技巧
- Learn to live in the present moment 学会生活在当下
- 四种情况,编译器必须为未声明构造函数之class合成一个默认构造函数
- 升力的产生
- 递归函数应用举例(集合元素的全排列)
- 堆和栈的区别
- 急求一遍论文
- 04/09/09