一、
线程是程序的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序设计器等)。但代码区是共享的,既不同的线程可以执行同样的函数,
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的任务(代码),也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
.net中如何实现多线程
线程肯定也是执行一段代码。所以产生一个线程,必须先为该线程写一个方法,在这个方法中的代码就是该线程运行所有要执行的代码
线程的启动,通过委托调用该方法
(线程启动时,通过传来的委托,委托就会执行相应的方法,实现线程执行方法)
产生一个线程的4步骤:
编写产生线程所要执行的方法
引用System.Threading命名空间
实例化Thread类,并传入一个指向线程要运行的方法的委托(这时这个线程已经产生但是没有运行)
调用Thread实例的Start方法,标记该线程可以被CPU执行了,但是具体执行的时间由CPU决定
前台线程和后台线程:
前台线程:只有所有的前台线程都关闭才能完成程序关闭
后台线程:只要所有的前台线程结束,后台线程自动结束
namespace 多线程1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
TextBox.CheckForIllegalCrossThreadCalls = false;
}
//单线程的缺点
private void btnSingleThread_Click(object sender, EventArgs e)
{
CountTime();
}
void CountTime()
{
DateTime beginTime = DateTime.Now;
for (int i = 0; i < 999999999; i++)
{
}
TimeSpan ts = beginTime.Subtract(DateTime.Now);//计算时差
MessageBox.Show("循环完毕~~~~:"+ts.TotalMilliseconds);
}
//使用多线程来解决UI卡死问题
private void btnMulThread_Click(object sender, EventArgs e)
{
//通过传委托执行方法
//ThreadStart ts = new ThreadStart(CountTime);//ThreadStart为委托
//创建线程对象传入要线程执行的方法
Thread threadfirst = new Thread(CountTime);
//将线程设置为后台线程(当所有的前台线程结束后,后台线程会自动退出)
threadfirst.IsBackground = true;
//启动线程,执行方法
threadfirst.Start();
}
/// <summary>
/// 修改文本框里的内容
/// </summary>
void ChangeText()
{
for (int i = 0; i < 1000; i++)
{
int a = int.Parse(txtNum.Text);
a++;
txtNum.Text = a.ToString();
Console.WriteLine(Thread.CurrentThread.Name + "a=" +a+"i="+i.ToString ());
}
}
private void btnProblem_Click(object sender, EventArgs e)
{
Thread thread = new Thread(ChangeText);
thread.Name = "t1";
thread.IsBackground = true;
thread.Start();
Thread thread2= new Thread(ChangeText);
thread2.Name = "t2";
thread2.IsBackground = true;
thread2.Start();
}
void ShowTxtName(object name)//z这里的参数为什么定义为object因为带参数的委托的参数是object类型,如果定义成string类型时,当传入参数时会报错
{
MessageBox.Show("name="+name.ToString ());
}
//线程执行带参数的方法
private void btnThreadWithPara_Click(object sender, EventArgs e)
{
//执行带参数的方法
Thread thread = new Thread(ShowTxtName);
thread.IsBackground = true;
thread.Start(txtName .Text );
}
//————————————————执行带多个参数的方法————————————
void ShowTxtName2(object li)//z这里的参数为什么定义为object 因为带参数的委托的参数是object类型,如果定义成string类型时,当传入参数时会报错
{
List<string> list = li as List<string>;
if (list!=null)
{
foreach (string s in list )
{
MessageBox.Show(s);
}
}
}
private void btnThreadWithManyPara_Click(object sender, EventArgs e)
{
Thread thread = new Thread(ShowTxtName2);
thread.IsBackground = true;
thread.Start(new List<string>() { "张三","李四","王五"});
}
}
}
---------------------- Windows Phone 7手机开发、 .Net培训、期待与您交流! ---------------------- 详细请查看: http://edu.csdn.net/heima/