关于线程和线程消息传递
2007-10-29 23:49 Animax! 阅读(375) 评论(0) 编辑 收藏 举报
首先,线程 Thread 存在于 System.Threading 命名空间.
简单调用线程的示例:
首先需要加入命名空间
其中ThreadStart是一个委托,用于 表示在 Thread 上执行的方法。
可以在 thread.Start() 之前更改线程的属性
注:.net 2.0 也就是使用 VS05的时候 可以直接这样写:
然后, 就是如何把需要的信息在线程启动之初传入到线程作处理:
这样就需要把工作的线程封装到一个类中 , 在使用线程时就初始化那个类 , 并把值传进线程
用上面的例子修改一下 :
class MainClass
{
ThreadClass threadClass = new ThreadClass(/*需要传入的值*/);
ThreadStart TStart = new ThreadStart(threadClass.run);
Thread thread = new Thread(TStart);
thread.Start();
}
class ThreadClass
{
object Parameters;
public ThreadClass(object parameters)
{
Parameters= parameters;
}
public void run()
{
// 使用传入的值 Parameters 工作
}
}
这样 , 就完成了初始化时给线程传入值了 .
但是在winform 的应用中 , 有时候会需要在线程工作到特定时候修改控件, 或显示一些线程的工作结果 。
这时候就要用到委托了。
再用上面的例子修改一下 :
其中 :
是自定义的一个委托,委托中的参数和你控制控件的那个过程的参数是一致的 。
嗯 , 就这样~ 本人水平有限 如有错漏 请指出。
简单调用线程的示例:
首先需要加入命名空间
using System.Threading;
主要代码 1 void Main()
2 {
3 ThreadStart TStart = new ThreadStart(run);
4 Thread thread = new Thread(TStart );
5 thread.Start();
6 }
7
8 void run()
9 {
10 //线程工作的代码
11 }
2 {
3 ThreadStart TStart = new ThreadStart(run);
4 Thread thread = new Thread(TStart );
5 thread.Start();
6 }
7
8 void run()
9 {
10 //线程工作的代码
11 }
其中ThreadStart是一个委托,用于 表示在 Thread 上执行的方法。
可以在 thread.Start() 之前更改线程的属性
thread.IsBackground = this;
是线程成为后台线程。 程序结束时候(我理解是当主线程结束时候)关闭此线程。注:.net 2.0 也就是使用 VS05的时候 可以直接这样写:
Thread thread = new Thread(run);
然后, 就是如何把需要的信息在线程启动之初传入到线程作处理:
这样就需要把工作的线程封装到一个类中 , 在使用线程时就初始化那个类 , 并把值传进线程
用上面的例子修改一下 :
class MainClass
{
ThreadClass threadClass = new ThreadClass(/*需要传入的值*/);
ThreadStart TStart = new ThreadStart(threadClass.run);
Thread thread = new Thread(TStart);
thread.Start();
}
class ThreadClass
{
object Parameters;
public ThreadClass(object parameters)
{
Parameters= parameters;
}
public void run()
{
// 使用传入的值 Parameters 工作
}
}
这样 , 就完成了初始化时给线程传入值了 .
但是在winform 的应用中 , 有时候会需要在线程工作到特定时候修改控件, 或显示一些线程的工作结果 。
这时候就要用到委托了。
再用上面的例子修改一下 :
// 窗体 class Form
{
// 一个事件
{
ThreadClass threadClass = new ThreadClass(this);
ThreadStart TStart = new ThreadStart(threadClass.run);
Thread thread = new Thread(TStart);
thread.Start();
}
public void Change(object Parameters)
{
/* 对控件的操作 */
}
}
class ThreadClass
{
private Form MainForm;
public delegate void MyInvoke(object obj);
public ThreadClass(Form mainForm)
{
MainForm = mainForm;
}
public void run()
{
MyInvoke Show = new MyInvoke(MainForm.Show);
MainForm.BeginInvoke(Show, new object[] { /* 需要传出的值 */ } );
}
}
{
// 一个事件
{
ThreadClass threadClass = new ThreadClass(this);
ThreadStart TStart = new ThreadStart(threadClass.run);
Thread thread = new Thread(TStart);
thread.Start();
}
public void Change(object Parameters)
{
/* 对控件的操作 */
}
}
class ThreadClass
{
private Form MainForm;
public delegate void MyInvoke(object obj);
public ThreadClass(Form mainForm)
{
MainForm = mainForm;
}
public void run()
{
MyInvoke Show = new MyInvoke(MainForm.Show);
MainForm.BeginInvoke(Show, new object[] { /* 需要传出的值 */ } );
}
}
其中 :
public delegate void MyInvoke(object obj);
是自定义的一个委托,委托中的参数和你控制控件的那个过程的参数是一致的 。
嗯 , 就这样~ 本人水平有限 如有错漏 请指出。