线程(Thread)
线程(Thread)是进程中的基本执行单元
多线程的优点:可以同时完成多个任务;可以使程序的响应速度更快;可以让占用大量处理时间的任务或当前没有进行处理的任务定期将处理时间让给别的任务;可以随时停止任务;可以设置每个任务的优先级以优化程序性能。
多线程实际上是通过时间片的间隔来完成的。
线程的内部数据结构:线程的ID、想成的环境(会在Cpu的寄存器中占用空间)
操作系统会默认分配1MB的空间给用户堆栈,用于局部变量和参数值传递,如果在创建一个线程时,使用了死循环,可能会造成堆栈异常,引发异常。
线程的时间开销:资源使用通知的开销、时间片切换的开销
在使用多线程时,不能随意的去开启或创建线程,这样可能会对程序的性能会有一定的影响,要考虑程序的性能问题,不是线程越多越好,满足程序要求的线程,才能有效的提高程序性能。
线程(Thread)开启的方式
线程的生命周期:开启 start()、暂停/挂起suppend()、继续Resume()、中断Interrupt()、终止Abort() 等待join()
Thread thread = new Thread(() =>
{
//这里编写的线程要处理的逻辑
Console.WriteLine("正在运行的线程id:" +
Thread.CurrentThread.ManagedThreadId);
});
thread.IsBackground = true;//设置线程为后台线程
thread.Start();//启动线程
Thread.Sleep(300);//设置事件间隔
通过ThreadState这个枚举来判断线程的状态
if (thread.ThreadState == ThreadState.Running ||
thread.ThreadState == ThreadState.WaitSleepJoin)
{
thread.Suspend();
}
线程等待join(),使用了join方法的线程会被先执行,再去执行其他线程的逻辑和主线程的逻辑
Thread thread = new Thread(() =>
{
//这里编写的线程要处理的逻辑
Console.WriteLine("正在运行的线程id:" + Thread.CurrentThread.ManagedThreadId);
});
thread.IsBackground = true;//设置线程为后台线程
thread.Start();//启动线程
thread.Join();
Thread.Sleep(300);//设置事件间隔
}
跨线程访问控件
Thread跨线程访问控件,可以通过Invoke方法访问到不同线程创建的控件,InvokeRequired判断是否有跨线程请求。
Thread thread = new Thread(() => {
if (label2.InvokeRequired)
{
label2.Invoke(new Action<string>(date => { label2.Text = date; }),"abc");
}
});
thread.IsBackground = true;
thread.Start();