多线程(Thread),其实很简单!
目录:
1:线程简介
2:怎么操作线程
4:简单的获奖机
5:应用程序域
作用:
让计算机"同时"做多件事情,节约时间。
多线程可以让一个程序“同时”处理多个事情。
后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况
解决问题:进程是一个资源的拥有者,因而在进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销,限制了并发程度的进一步提高
创建线程:
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什么时候执行,由操作系统决定,
注意:当线程指向的方法体执行完成的时候就自动销毁了
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 = "开始"; } } } }
应用程序域就是隔离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