---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
对于一个正在运行的程序(即.exe文件)来说,它就是一个进程。这一个进程里面至少要有一个线程,也可以包含很多个线程,即多线程。同一个进程之间的多个线程之间可以“并发”执行。一个程序的默认线程就是它的主线程,当主线程正在执行任务时,它是不能进行其它任何操作的,只有主线程把这个任务进行完毕之后,它才能够响应其它操作。使用多线程,有以下几个优点:
1.让计算机“同时”做多件事情,节约时间;
2.后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况;
3.多线程可以让一个程序同时处理多个事情;
4.计算机CPU大部分时间处于空闲状态,浪费了CPU资源。
多线程既然可以做这么多事,那么如何在.Net中实现多线程呢?首先,线程肯定也是要执行一段代码的,所以要产生一个线程,必须先为该线程写一个方法,这个方法中的代码就是该线程运行所要执行的代码。当线程启动时,就可以通过调用传过来的委托来实现用线程执行该方法。
有这样一个如图所示的窗体:
主要代码如下所示:
/// <summary>
/// 单线程处理方法事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSingleThread_Click(object sender, EventArgs e)
{
NewMethod();
}
/// <summary>
/// 线程执行的方法
/// </summary>
private static void NewMethod()
{
DateTime beginTime = DateTime.Now; //循环开始的执行时间
for (int i = 0; i < 999999999; i++)
{
}
TimeSpan ts = DateTime.Now.Subtract(beginTime); //循环结束时间隔的时间
MessageBox.Show("执行完毕!" + ts.TotalMilliseconds);
}
/// <summary>
/// 多线程处理方法事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnMultiThread_Click(object sender, EventArgs e)
{
//创建线程对象,同时传入一个委托
Thread thread = new Thread(new ThreadStart(NewMethod));
//把该线程设置为后台线程
thread.IsBackground = true;
//启动线程
thread.Start();
}
如下图:当我们点击“单线程的缺点”这个按钮时,主线程执行循环操作,这时候我们不能对窗体作其它任何操作(比如:移动窗体),因为对窗体进行的任何操作都是由主线程来监听的,但此时主线程正在执行循环,它无法分身来响应我们对它进行的操作。而当我们点击“多线程的实现”这个按钮时,我们发现,此时可以对窗体进行诸如移动窗体之类的操作,因为循环里面的代码已经交给另一个线程在执行,此时主线程是空闲的,所以可以响应用户的操作。单线程执行结果
多线程执行结果
另外,在程序中,我定义了一个TimeSpan来获取执行循环所要花费的时间(毫秒)。我们可以看到,多线程的执行时间明显要比单线程大那么一点。这是因为我们对窗体进行过移动的操作,多出来的时间就是CPU响应用户对主窗体进行操作的时间。在单线程里面,我们必须要等到CPU执行循环完毕之后,才可以对窗体进行其它操作,但此时CPU的资源有很多都没有被使用。而在多线程里面,我们就不必花这个时间等待程序执行完毕再进行其它操作,因为主线程此时是空闲的。这就是以“空间”换时间。
在代码中,有这样一句话:thread.IsBackground = true; ,这段代码的意思是把当前创建的线程对象设置为后台线程。如果没有这段代码,那么在运行的时候,如果我们关闭主窗体(也就是退出程序),这个线程仍然会继续执行,因为它默认是前台线程。但有时我们在关闭主窗体时,不希望计算机响应我们之前对它进行的操作,此时我们就可以把它设置为后台线程。前台线程的特点是,只有所有的前台线程都关闭之后,程序才能退出。后台线程的特点是,只要所有的前台线程结束,不管后台线程有没有执行完毕,所有的后台线程都要关闭。因此要想点击关闭按钮的时候,程序也会退出,就要把新建的线程对象设置为后台线程。
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------