0. 什么是多线程?
初学编程的伙伴们对单线程一定很熟悉,一定记得计算汉诺塔等时间复杂度比较大的程序时,控制台会“卡住”半天才蹦出结果。所谓单线程,就是一次只完成一项任务(Task),只有完成了手上这个步骤,才会继续下一个步骤。而多线程,其实就是多个任务同时执行(Multi-tasking)。比如说,一边煮咖啡,一边写代码,煮咖啡与写代码就是两个独立的线程。
为什么我们需要多线程?因为单线程有其局限性。单线程的程序,就是只能先煮好咖啡, 再去写代码(当然对码农而言更可能是反过来),咖啡没有煮好,就必须蹲在咖啡壶前傻等,别的什么也不能做,所谓的“线程阻塞”,就是这个意思,线程会卡住,窗体界面会卡死。而有了多线程,就可以在等咖啡好的同时敲代码,这对不得不熬夜的码农而已,实在是快乐++的助攻(也是发量减减的助攻)。
咖啡壶会在煮好后发出提示音,这代表这个线程结束了。同样的,多线程任务也可能在结束时返回值,或者返回void空值,就是没有返回值的意思。
1. .NET平台常用的多线程分类
多线程操作有两种常用写法,一种是Thread,另一种是async/await语句。这次我们主要谈论Thread语法,async/await语句留给下一篇。
2. Thread用法举例
此处代码完成了Thread变量、ThreadStart变量的声明、实例化以及线程的开启操作。
using System.Threading.Tasks;
namespace asyncRead
{
public partial class Form1 : Form
{
#region 多线程Thread定义
Thread thCache;
ThreadStart tsCache;
#endregion
public Form1()
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
//运行跨线程更新控件
tsCache = new ThreadStart(UpdateCache);
//链接thCache与返回值与参量均为void的函数UpdateCache
}
public void UpdateCache()
{
//多线程操作
}
public void Action()
{
thCache = new Thread(tsCache);
thCache.Start();
}
}
3. 用法详解
线程的声明 | 名称1= ThreadStart(方法名);名称2 = Thread(名称1); | 方法参数与返回值都为void |
名称1 = ParameterizedThreadStart(方法名); 名称2 =Thread(名称1); | 方法的参数为object,返回值为void | |
线程的开始 | 名称2.Start() | |
线程的终止 | 名称2.Abort() |
注意,必须先实例化线程,才能执行开始与中止操作。可以在开始或终止前加空值判断(if(名称2==null)或直接用空值运算符?.)。还可以查看ThreadState属性,确定线程状态。