热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设置线程堆栈大小_多线程基础.NET

多线程线程被定义为程序的执行流。每个线程都定义了一个单独的控制流。如果应用程序涉及到复杂的和耗时的操作,那么将程序分成多个线程执行流往往是有益的,每个线

多线程

8818f58bbb6ce2886b3bb98c12f6abb7.png

  • 线程 被定义为程序的执行流。每个线程都定义了一个单独的控制流。如果应用程序涉及到复杂的和耗时的操作,那么将程序分成多个线程执行流往往是有益的,每个线程执行特定的工作。
  • 线程是轻量级进程。一个使用线程的常见实例是现代操作系统中并行编程的实现。使用线程节省了 CPU 周期的浪费,同时提高了应用程序的效率。
  • 为了同时执行多个任务,一个程序可以被划分为更小的线程。

线程生命周期

线程生命周期开始于 System.Threading.Thread 类的对象被创建时,结束于线程被终止或完成执行时。

  • 未启动状态:当线程实例被创建但Start方法未被调用时的状况。
  • 就绪状态:当调用了Start,线程准备好运行并等待 CPU 周期时的状况。
  • 不可运行状态:下面的几种情况下线程是不可运行的:
  • 已经调用 Sleep 方法
  • 已经调用 Wait 方法
  • 通过 I/O 操作阻塞
  • 死亡状态:当线程已完成执行或已中止时的状况。

主线程

  • 在 C# 中,System.Threading.Thread 类用于线程的工作。它允许创建并访问多线程应用程序中的单个线程。进程中第一个被执行的线程称为主线程。
  • 当 C# 程序开始执行时,主线程自动创建。使用 Thread 类创建的线程被主线程的子线程调用。您可以使用 Thread 类的 CurrentThread 属性访问线程。

创建线程

构造函数

#ThreadStart:#public delegate void ThreadStart();//一个无参数,无返回值的委托#ParameterizedThreadStart:#public delegate void ParameterizedThreadStart(object obj);//一个有一个参数、但无返回值的委托#maxStackSize:线程要使用的最大堆栈大小(以字节为单位);如果为 0 则使用可执行文件的文件头中指定的默认最大堆栈大小。 重要地,对于部分受信任的代码,如果 maxStackSize 大于默认堆栈大小,则将其忽略。 不引发异常。public Thread(ThreadStart start);public Thread(ParameterizedThreadStart start);public Thread(ThreadStart start, int maxStackSize);public Thread(ParameterizedThreadStart start, int maxStackSize);

新建线程

public static void CallToChildThread(){ Console.WriteLine("Child thread starts");}ThreadStart childref = new ThreadStart(CallToChildThread);Thread childThread = new Thread(childref);childThread.Start();

调用Start之后,一个线程就进入了就绪状态了,等着CPU分配时间片即可。

以上,就是C#的多线程基本知识,如果你只是需要偶尔在程序中使用以下多线程,那么上面的知识就够你启动一个子线程,并将想要执行的任务放到子线程中执行了。

但如果你在线程中大量使用多线程,那么就可能遇到诸如:线程同步、死锁、控制线程状态等需求。


前后线程&后台线程

#获取或设置一个值,该值指示某个线程是否为后台线程。public bool IsBackground { get; set; }

.Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程。

这两者的区别就是:

  • 应用程序必须运行完所有的前台线程才可以退出;
  • 对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。

.NET环境使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=false,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。

一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序。

  • 应用程序的主线程以及使用Thread构造的线程都默认为前台线程
  • 线程池线程也就是使用 ThreadPool.QueueUserWorkItem()和Task工厂创建的线程都默认为后台线程

线程执行状态(IsAlive)

#获取一个值,该值指示当前线程的执行状态。#如果此线程已启动并且尚未正常终止或中止,则为 true;否则为 false。public bool IsAlive { get; }

线程状态(ThreadState)

#获取一个值,该值包含当前线程的状态#System.Threading.ThreadState 值之一(Running、StopRequested、SuspendRequested、Background、Unstarted、Stopped、WaitSleepJoin、Suspended、AbortRequested、Aborted),它指示当前线程的状态。 初始值为 Unstarted。public ThreadState ThreadState { get; }

线程归属(IsThreadPoolThread)

#获取一个值,该值指示线程是否属于托管线程池。#如果此线程属于托管线程池,则为 true;否则为 false。public bool IsThreadPoolThread { get; }

线程标识符(ManagedThreadId)

#获取当前托管线程的唯一标识符。#一个整数,表示此托管线程的唯一标识符。public int ManagedThreadId { get; }

线程名字(Name)

#获取或设置线程的名称。#包含线程名称的字符串,或者如果未设置名称,则为 null。public string Name { get; set; }

线程优先级(Priority)

#获取或设置一个值,该值指示线程的调度优先级。#System.Threading.ThreadPriority(Lowest、BelowNormal、Normal、AboveNormal、Highest) 值之一。 默认值为 Normal。public ThreadPriority Priority { get; set; }

立即执行当前线程,同时阻塞其余线程

#在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止或经过了指定时间为止。#如果线程已终止,则为 true;如果线程在经过了 millisecondsTimeout 参数指定的时间量后未终止,则为 false。public void Join();public bool Join(int millisecondsTimeout);public bool Join(TimeSpan timeout);

这个方法可以使当前线程立即执行,如果没有参数,则会一直等到当前线程执行结束,如果有参数,则当过时间之后,就会取消这种超级优先级状态。

挂起线程与继续挂起线程

#挂起线程,或者如果线程已挂起,则不起作用。public void Suspend();#继续已挂起的线程。public void Resume();

线程休眠(sleep)

#timeout:设置为线程被阻塞的时间量的 System.TimeSpan。 指定零以指示应挂起此线程以使其他等待线程能够执行。 指定 System.Threading.Timeout.Infinite以无限期阻止线程。public static void Sleep(TimeSpan timeout);#线程被阻塞的毫秒数。 指定零 (0) 以指示应挂起此线程以使其他等待线程能够执行。 指定 System.Threading.Timeout.Infinite以无限期阻止线程。public static void Sleep(int millisecondsTimeout);#当前线程暂停 5000 毫秒int sleepfor = 5000;Thread.Sleep(sleepfor);

销毁线程(Abort)

  • Abort() 方法用于销毁线程。
  • 通过抛出 threadabortexception 在运行时中止线程。这个异常不能被捕获,如果有 finally 块,控制会被送至 finally 块。

#在调用此方法的线程上引发 System.Threading.ThreadAbortException&#xff0c;以开始终止此线程的过程。 调用此方法通常会终止线程。public void Abort(object stateInfo);public void Abort();public static void CallToChildThread(){ try{ Console.WriteLine("Child thread starts"); // 计数到 10 for (int counter &#61; 0; counter <&#61; 10; counter&#43;&#43;) { Thread.Sleep(500); Console.WriteLine(counter); } Console.WriteLine("Child Thread Completed"); } catch (ThreadAbortException e) { Console.WriteLine("Thread Abort Exception"); } finally { Console.WriteLine("Couldn&#39;t catch the Thread Exception"); }}static void Main(string[] args){ ThreadStart childref &#61; new ThreadStart(CallToChildThread); Console.WriteLine("In Main: Creating the Child thread"); Thread childThread &#61; new Thread(childref); childThread.Start(); // 停止主线程一段时间 Thread.Sleep(2000); // 现在中止子线程 Console.WriteLine("In Main: Aborting the Child thread"); childThread.Abort(); Console.ReadKey(); }

当上面的代码被编译和执行时&#xff0c;它会产生下列结果&#xff1a;

In Main: Creating the Child threadChild thread starts012In Main: Aborting the Child threadThread Abort ExceptionCouldn&#39;t catch the Thread Exceptio

一个每日更新的干货公众号



推荐阅读
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 在一个包含四个活动的活动组中,作者遇到了一个屏幕方向的问题。在其中三个活动中,作者将屏幕方向设置为纵向,但需要一个活动在设备旋转时改变方向。通过删除ActivityGroup在AndroidManifest文件中的Portrait设置,作者解决了这个问题。 ... [详细]
  • AFNetwork框架(零)使用NSURLSession进行网络请求
    本文介绍了AFNetwork框架中使用NSURLSession进行网络请求的方法,包括NSURLSession的配置、请求的创建和执行等步骤。同时还介绍了NSURLSessionDelegate和NSURLSessionConfiguration的相关内容。通过本文可以了解到AFNetwork框架中使用NSURLSession进行网络请求的基本流程和注意事项。 ... [详细]
author-avatar
亲清吻文kiss
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有