多线程(Thread),其实很简单!

目录:

     1:线程简介

      2:怎么操作线程

      4:简单的获奖机

    5:应用程序域

 
线程是Windows任务调度的最小单位。线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
作用:
   让计算机"同时"做多件事情,节约时间。

  多线程可以让一个程序“同时”处理多个事情。

  后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况

 
解决问题:进程是一个资源的拥有者,因而在进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销,限制了并发程度的进一步提高
 
怎么操作线程?

 创建线程:

1:初始化

Thread thread = new Thread(ThreadWorkFun);//ThreadWorkFun是一个委托

2:

  new Thread(() =>
                {
                Console.WriteLine("ok");
                 }
                ).start();

开启线程:

 thread.Start();

一个具体的例子:

        //任何代码都执行在线程中的,当前main方法执行在主线程中,(也就是默认线程)
        static void Main(string[] args)
        {
            //创建一个线程,执行当然线程的执行入口ThreadWork
            Thread thread = new Thread(ThreadWork);
            thread.Start();//告诉线程你可以调度我了
            Console.WriteLine("==============结束");
            Console.ReadKey();
        }
        static void ThreadWork()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(i);
            }
        }
     

结果:结果不确定,ThreadWorkFun什么时候执行,由操作系统决定,

注意:当线程指向的方法体执行完成的时候就自动销毁了

 

Thread的常用属性和方法

   Abort():在调用此方法的线程上引发 ThreadAbortException终止线程--尽量少用,因为会抛出异常,如果抛异常会极大影响效率。

 

    GetDomain():返回当前线程正在其中运行的当前域。

 

 

   Priority:设置线程的优先级   thread.Priority = ThreadPriority.Highest;

 

        ManagedThreadId:  int num= thread.ManagedThreadId;//线程的编号,可以用于区分不同的线程
        CurrentThread.Name :获得当前线程的名字

       Join:线程等待             

 thread.join();//哪个线程执行当前代码的线程等待这个线程执行完成

 

  IsBackground:获取或设置一个值,该值指示某个线程是否为后台线程,值默认是false:前台线程:只有所有的前台线程都关闭才能完成程序关闭。后台线程:只要所有的前台线程结束,后台线程自动结束

 

 多线程实现的摇奖机

 

namespace 摇奖器
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InitLabel();
            InitName();

        }
        public Label label = new Label();
        public Dictionary<int, string> Dic = new Dictionary<int, string>();
        bool IsTure;
        public void InitLabel()
        {
            label.Text = "0";
            label.Location = new Point(100, 100);
            label.AutoSize = true;
            this.Controls.Add(label);
        }
        public void InitName()
        {
            string[] names = File.ReadAllLines("name.txt",Encoding.Default);
            for (int i = 0; i < names.Length; i++)
            {
                Dic.Add(i, names[i]);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            IsTure = false;
        }

        private void btnBegin_Click(object sender, EventArgs e)
        {
            if (btnBegin.Text == "开始")
            {
                btnBegin.Text = "结束";
                IsTure = true;
                new Thread(() =>
                {
                    Random r = new Random();
                    while (IsTure)
                    {
                        if (label.InvokeRequired)//判段lable标签是否是由当前线程创建的,解决跨线程调用的问题
                        {
                            Action SetLabelText=delegate()//匿名委托
                            {
                                label.Text = Dic[r.Next(0, Dic.Count)];
                            };
                            label.Invoke(SetLabelText);
                        }
                        Thread.Sleep(100);//当前线程休息一下
                    }

                }).Start();
            }
            else
            {
                IsTure = false;
                btnBegin.Text = "开始";
            }
        }
    }
}

 

应用程序域:只有DotNet程序才会有的概念
 应用程序域就是隔离exe。可以加载多个程序集,
一个进程可以有多个应用程序域
一个应用程序域可以跑多个线程
一个线程同一时间只可以执行在一个应用程序域里面,但线程可以穿透应用程序域
例子:
       static void Main(string[] args)
        {
            AppDomain appDomain = AppDomain.CreateDomain("ghr");// 创建一个应用程序域
            appDomain.ExecuteAssembly("QQ.exe");//启动qq程序
            Console.WriteLine("主域执行完成");
        } 

 

 了解更多:http://msdn.microsoft.com/zh-cn/library/system.threading.thread_members

 

posted @ 2013-07-02 16:01  卡西法儿  阅读(430)  评论(0编辑  收藏  举报