一、进程
.一个程序就是一个进程,一个进程至少包含一个线程(主线程)。同一个进程中的多个线程之间可以“并发”执行。
二、线程
线程的用途:CPU通过线程执行代码块中的代码,即用来执行代码块中的代码。
线程是程序中的一个执行流,每个线程都有自己的专有寄存器,但代码区是共享的,即不同的线程可以执行同样的函数。
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序 创建多个并行执行的线程来完成各自的任务。
多个线程的“并发”执行指的是:多个线程之间不断的切换执行。
要产生一个线程必须 为该线程写一个方法,这个方法中的代码就是该线程的运行所要执行的代码(这个方法就好比你要这个线程做的事情),线程在启动时通过委托调用该方法(线程启动时,调用传过来的委托,委托就会执行相应的方法。实现线程执行方法)。
单线程带来的问题:
例如:新建个窗体应用程序,在窗体上放一个button按钮,在button按钮的Click事件中写如下代码:
private void btnlogin_Click(object sender, EventArgs e)
{
for (int i = 0; i < 999999999; i++)
{
}
MessageBox.Show("循环完毕!");
}
然后再启动调试,弹出个窗体这时候你可以用鼠标移动窗体,但是当你点击button按钮时,窗体就不能移动了。这是因为一个程序就是一个进程,一个进程默认只有一个线程(主线程),在你点击按钮时当前的主线程去做循环去了,不会去相应用户的操作。(就好像收银员去接待客人去了,收银台就没有人收银了一样)
解决办法就是使用多线程,代码如下:
//使用多线程解决UI卡死问题
private void btnlogin_Click(object sender, EventArgs e)
{
//创建线程对象 传入 让线程执行的方法
Thread threadfirst = new Thread(CountTime);
//启动线程执行方法
threadfirst.Start();
}
/// <summary>
/// 循环技术方法
/// </summary>
private static void CountTime()
{
for (int i = 0; i < 999999999; i++)
{
}
MessageBox.Show("循环完毕!");
}
启动程序后点击button按钮就不会出现UI卡死问题,因为在点按钮时,主线程创建了一个线程把Click事件要处理的代码交给这个新线程去解决,UI线程去相应用户的操作。(就好像收银员把接待客人的事情交给了销售员,而收银员只收银一样) |