新建win应用程序项目:testthread,把Form1.cs改名mainForm.cs,同时修改类名和main里的类名。
2、
在项目中添加一个类:SubThread,用来管理子线程及线程处理。代码如下:注释很清楚的
using
System;
using
System.Collections.Generic;
using
System.Text;
namespace
testthread
{
//
定义一个代理参数类,用以传递信息,可以根据自己的需要添加属性
public class MessageEventArgs : EventArgs
{
public String Message; //
传递辽符串信息
public MessageEventArgs(string message)
{
this.Message = message;
}
}
class SubThread
{
/*
定义代理
*
名称MessageEventHandler;
*
参数
* object
是发送者
* MessageEventArgs
发送的信息
* */
public delegate void MessageEventHandler(object sender, MessageEventArgs e);
//
定义事件
public event MessageEventHandler MessageSend;
/*
*
说明:定义事件处理函数,当然这里也可以不用直接在引发事件时调用this.MessageSend(sender, e);
*
这里的参数要和事件代理的参数一样
* */
public void OnMessageSend(object sender, MessageEventArgs e)
{
if (MessageSend != null)
this.MessageSend(sender, e);
}
//
定义一个线程
public System.Threading.Thread sendthread;
/*
线程处理函数
*
说明:每毫秒向主界面发送一次信息
* */
public void Sendding()
{
try
{
while (true)
{
System.Threading.Thread.Sleep(200);
this.OnMessageSend(this, new MessageEventArgs(DateTime.Now.ToString()));
}
}
catch
{
}
}
//
开始线程函数
public void StartSend()
{
sendthread = new System.Threading.Thread(new System.Threading.ThreadStart(Sendding));
sendthread.Start();
}
//
结束线程函数
public void EndSend()
{
sendthread.Abort();
}
}
}
3、
在主窗体上添加两个按钮,一个开始一个结束,再添加一个ListBox用来显示信息,看看主界面程序中是怎样调用处理的,有注释不再多说:
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
using
System.Threading;
namespace
testthread
{
public partial class mainForm : Form
{
SubThread _subthread;//
定义一个线程
/*
定义一代理
*
说明:其实例作为Invoke参数,以实现后台线程调用主线的函数
* MessageEventArgs
传递显示的信息.
* */
public delegate void MessageHandler(MessageEventArgs e);
public mainForm()
{
InitializeComponent();
}
private void mainForm_Load(object sender, EventArgs e)
{
this._subthread = new SubThread();
//
添加后台线程的消息处理实现函数,
this._subthread.MessageSend += new SubThread.MessageEventHandler(this._subthread_MessageSend);
}
public void Message(MessageEventArgs e)
{
listBox1.Items.Add( e.Message);
}
/*
说明:通过代理,消息事件,实际就是实现在后台线程调用本函数,以前就说了在后台线程中不能直接把消息发送到主线程,
*
那么就要用到Invoke,关于怎么用不再多说
*
参数要和MessageEventArgs代理的参数一至
* **/
private void _subthread_MessageSend(object sender, MessageEventArgs e)
{
//
实例化代理
MessageHandler handler = new MessageHandler(Message);
//
调用Invoke
this.Invoke(handler, new object[] { e });
}
private void button1_Click(object sender, EventArgs e)
{
this._subthread.StartSend();
this.listBox1.Items.Add("
开始...."
);
}
private void button2_Click(object sender, EventArgs e)
{
this._subthread.EndSend();
this.listBox1.Items.Add("
停止"
);
}
}
}