【代码】C#线程模板

Posted on Posted in 计算机690 views

注:该代码创建于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