前言:原本想根据本身的经验总结一下c#线程相关的知识点, 写以前看了一些其余人的博客,发现本身也就掌握了不到三分之一。。。。但愿经过此次的博客将本身的知识点补充一下,写出更直白的博客和初学者分享。html
这是我参考的博客地址:http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html 。编程
这个是他参考的英文原著地址:http://www.albahari.com/threading/c#
原博客介绍的能够说深刻浅出,鞭辟入里。不过我想写出更适合小白的,直接拿去就能够用到程序里的博客。多线程
一. 什么是线程(知道下面几点有助于了解)this
1. 一个CPU同一时间只能作一件事,不过它处理信息太快了,甚至咱们使用它的时候,把它分红了不少的时钟周期(就是很短的时间间隔),再去把这些之间间隔分配个不一样的应用,它也能很顺畅的完成处理。就好像它能同时处理不少事同样,咱们根据这一点,就能够进行多线程,和多进程编程了。spa
2.进程是资源分配的基本单位。咱们建立一个程序,默认是一个进程的,这个进程中包含了一个线程(主线程)。如今咱们要在这个基础上再去进行建立新的线程。(不少时候须要这样)线程
3.进程中的线程,能够共享进程中的资源。3d
4.线程是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。代理
二.为何要开启新的线程调试
有不少时候主线程处理数据消耗太多时间,致使鼠标不能用,程序看起来卡住了。这时候,咱们能够把消耗时间的事放到一个单独的线程里,让主线程轻松起来。
三. 多线程的使用
1.目标
在主线程中开启一个线程,线程传回数据在主窗体中的文本框中显示。
下面是全部的代码,其中包括了代理 、Invoke、Lock,的使用。这个小的例子就能够帮助你开始使用线程了。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace 线程浅析 { //建立SetValue的委托 public delegate void SetValueDel(string str,object obj); public partial class Form1 : Form { public Form1() { InitializeComponent(); Thread.CurrentThread.Name = "MainThread"; } //开启一个线程 private void btnStart_Click(object sender, EventArgs e) { //将委托的方法和主窗体传过去 NEWThreadClass threadOneClass = new NEWThreadClass(SetValue, this); Thread TheThreadOne = new Thread(threadOneClass.threadOne);//不须要ThreadStart()也能够 TheThreadOne.Name = "TheThreadOne";//给线程命名,方便调试。这行代码能够省略。 //让线程变为后台线程(默认是前台的),这样主线程结束了,这个线程也会结束。要否则,任何前台线程在运行都会保持程序存活。 TheThreadOne.IsBackground = true; TheThreadOne.Start(); } //给文本框赋值 private void SetValue(string str, object obj) { //lock里面的代码同一个时刻,只能被一个线程使用。其它的后面排队。这样防止数据混乱。 lock (obj) { this.txtReturnValue.Text = this.txtReturnValue.Text + str; } } } //建一个类,模拟实际使用状况 public class NEWThreadClass { //接收主窗体传过来的委托方法。 public SetValueDel setValueDel; //接收主窗体 public Form form; //用于告诉主线程中锁,是哪个线程调用的。 static object locker = new object(); public NEWThreadClass(SetValueDel del ,Form fom) { this.setValueDel = del; this.form = fom; } //第一个线程,给主线程建立的控件传值。 public void threadOne() { //这里获取线程的名字 string threadName = Thread.CurrentThread.Name; try { while (true) { //告诉主线程,我要更改你的控件了。 this.form.Invoke((EventHandler)(delegate { //若是在这里使用Thread.CurrentThread.Name 获取到的是主线程的名字。 setValueDel(threadName + " :Hello!", locker);//给文本框传值,“本身的名字:Hello!”。 })); Thread.Sleep(3 * 1000);//太累了 ,休息三秒。。。。 } } catch (Exception ex) { } } } }