注:该代码创建于2013.12月,是C#下线程学习时写的代码实例,也是UDP学习时,服务器端的部分代码,主要是Thread的学习。
//2013-12-05,xia-evan 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 SThread { public partial class ThreadFM : Form { /* *Thread对象的方法 * Abort 调用此方法通常会终止线程,但会引起ThreadAbortException类型异常。 * Interrupt 中断处于WaitSleepJoin 线程状态的线程。 * Join 阻塞调用线程,直到某个线程终止时为止。 * ResetAbort 取消当前线程调用的Abor方法。 * Resume 继续已挂起的线程。 * Sleep 当前线程阻塞指定的毫秒数。 * Start 操作系统将当前实例的状态更改为ThreadState.Running。 * Suspend 挂起线程,或者如果线程已挂起,则不起作用。 * *Thread对象属性 * CurrentCulture 获取或设置当前线程的区域性。 * CurrentThread 获取当前正在运行的线程。 * IsAlive 获取一个值,该值指示当前线程的执行状态。 * IsBackground 获取或设置一个值,该值指示某个线程是否为后台线程。 * Name 获取或设置线程的名称。 * Priority 获取或设置一个值,该值指示线程的调度优先级。 * ThreadState 获取一个值,该值包含当前线程的状态。 */ public ThreadFM() { InitializeComponent(); } //存储当前进程状态(0、未运行;1运行;2、暂停) private int active = 0; //一个线程 private Thread thread = null; //定义了一个托管方法 public delegate void DataArrivalEventHandler(string str1,string str2); private string message = "-evan"; //获取当前接收的消息<线程函数> private void GetUDPData() { /* * 线程一直反复运行try内部代码,要手动销毁 * 如果不加则运行一遍try内部代码后线程就自动销毁 */ while (active == 1) { try { //模拟线程运行时间 Thread.Sleep(1000); //---------------------------- //线程运行代码 //---------------------------- DataArrivalEventHandler showThread = new DataArrivalEventHandler(ShowThread); object[] objs = new object[2]; objs[0] = "xia"+message; objs[1] = DateTime.Now.ToString(); Invoke(showThread, objs); // Thread.Sleep(1000); } catch { } } } //线程运行状态下将信息返回到主线程;主线程向线程发送信息可以通过变量实现 public void ShowThread(string str, string str2) { //---------------------------- //线程将信息交互到主线程 //---------------------------- lsb_showInfo.Items.Add("线程" + str + "在" + str2 + "时运行一次!"); } //开启线程事件 private void btn_kq_Click(object sender, EventArgs e) { switch (active) { case 0://线程未运行状态,新建线程 if (thread == null || !thread.IsAlive) { //创建一个线程 thread = new Thread(new ThreadStart(GetUDPData)); //开启函数 thread.Start(); active = 1; btn_kq.Text = "暂 停"; btn_js.Enabled = true; } break; case 1://线程运行状态,暂停线程 if (thread != null) { //暂停函数 thread.Suspend(); active = 2; btn_kq.Text = "继 续"; } break; case 2: //线程暂停状态,唤醒线程 if (thread != null) { //唤醒 thread.Resume(); active = 1; btn_kq.Text = "唤 醒"; } break; } } //结束线程 private void btn_js_Click(object sender, EventArgs e) { if (thread != null) { if (!thread.IsAlive) thread.Resume(); Thread.Sleep(1000); //销毁线程,如果线程被挂起则会出异常 thread.Abort(); } Thread.Sleep(100); if(!thread.IsAlive) lsb_showInfo.Items.Add("线程在" + DateTime.Now + "时结束!"); active = 0; btn_js.Enabled = false; btn_kq.Text = "开 启"; } //退出 private void ThreadFM_FormClosing(object sender, FormClosingEventArgs e) { if (thread != null) thread.Abort(); System.Environment.Exit(0);//Application.Exit(); } } }转载标明出处:https://blog.evanxia.com/2015/12/224