`

C#/.NET主线程与子线程之间的关系

    博客分类:
  • C#
阅读更多
以前一直没有在程序中写过总结,再翻开程序时却不知所云,所以我决定写总结
        一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程。
      有的博客上说“至少一个主线程”,这一说法持有怀疑
         主线程与子线程之间的关系
         **默认情况,在新开启一个子线程的时候,他是前台线程,只有,将线程的IsBackground属性设为true;他才是后台线程
         *当子线程是前台线程,则主线程结束并不影响其他线程的执行,只有所有前台线程都结束,程序结束
         *当子线程是后台线程,则主线程的结束,会导致子线程的强迫结束
            (个人理解,这样设计的原因:因为后台线程一般做的都是需要花费大量时间的工作,如果不这样设计,主线程已经结束,而后台工作线程还在继续,第一有可能使程序陷入死循环,第二主线程已经结束,后台线程即时执行完成也已经没有什么实际的意义)
        
         实例代码:
        
static Thread Mainthread;  //静态变量,用来获取主线程
      static void Main(string[] args)
        {
           Mainthread= Thread.CurrentThread;//获取主线程
           Test1();
          }
 private static void Test1()
        {
            Console.WriteLine("在主进程中启动一个线程!");
            Thread firstChild = new Thread(new ParameterizedThreadStart(ThreadProc));//threadStart 是一个委托,代表一个类型的方法
            firstChild.Name = "线程1";
            firstChild.IsBackground = true;
            firstChild.Start(firstChild.Name);//启动线程
            Thread secondChild = new Thread(new ParameterizedThreadStart(ThreadProc));
            secondChild.Name = "线程2";
            secondChild.IsBackground = true;
            secondChild.Start(secondChild.Name);
            Console.WriteLine("主线程结束");
            Console.WriteLine(Mainthread.ThreadState);
            Mainthread.Abort();
        }
        private static void ThreadProc(object str)
        {
            
            for (int i = 0; i < 10; i++)
            {
               
                Console.WriteLine(Mainthread.ThreadState);
                Console.Write(str+"调用ThreadProc: " + i.ToString() + "\r\n");
                if (i == 9)
                    Console.WriteLine(str + "结束");
                Thread.Sleep(2000);//线程被阻塞的毫秒数。0表示应挂起此线程以使其他等待线程能够执行
            }
        }
分享到:
评论

相关推荐

    如何使用主线程异常捕获错误例子C#.net源代码编写

    如何使用主线程异常捕获错误例子C#.net源代码编写

    vb.net C#线程锁超时控制代码

    1.[主线程]:请求方发送请求,立即创建超时等待线程锁 2.[异步线程]:接收数据,数据包合并,数据包合并完成后向解锁主线程 3,[主线程]:超时则进入超时异常,接到异步线程的通知则进入后续业务 我们在使用时会发现,第...

    VBnet 分线程窗体,主线程卡死任然报告方法的进度值到UI窗体上面

    VBnet源码,C#可用。分线程窗体,主线程卡死任然报告方法的进度值到UI窗体上面

    .net 4.0新增的Task,更简单的使用线程完成并行计算

    .NET 4.0引入的一个新概念---任务,作为支持并行运算的重要...本资源文件中模拟一个插件的工作,在主线程中分配插件的任务,如果插件执行超时,则主线程中断任务,子线程中的任务完成时,则主线程中输出子线程的返回值

    C#多任务多线程下载组件V1.1(源代码)

    而涉及到线程控制的事件(如结束下载线程),为了确保事件处理能正常执行,则才采用主线程代理的方式处理。 这种代理方式是由于系统中直接操作线程引发的,如果改用系统线程池的话,可以重新定制处理流程。

    C#多任务多线程下载组件V1.1[源代码]

    而涉及到线程控制的事件(如结束下载线程),为了确保事件处理能正常执行,则才采用主线程代理的方式处理。 这种代理方式是由于系统中直接操作线程引发的,如果改用系统线程池的话,可以重新定制处理流程。

    C# 线程相关知识总结

    但是对于.NET的客户端程序(Console,WPF,WinForms)是由CLR创建的单线程(主线程,且只创建一个线程)来启动。在该线程上可以创建其他线程。 图: 线程工作方式 多线程由内部线程调度程序管理,线程调度器通常是...

    C#综合揭秘——细说多线程(中)

    这一节开始为大家介绍一下CLR线程池的I/O线程I/O线程是.NET专为访问外部资源所设置的一种线程,因为访问外部资源常常要受到外界因素的影响,为了防止让主线程受影响而长期处于阻塞状态,.NET为多个I/O操作都建立起了...

    RSR Libraries:C# .Net 库,其中包含带有使用示例的方便类。-开源

    - 用于在 Windows 窗体环境中与主线程同步的助手类。 例如,如果您想从不同的线程向 ListBox 添加项目。 - 从一般文本或文件名中删除变音符号的类 对于下载使用应用程序“Mercurial”http://mercurial.selenic.com/...

    多线程进度条避免窗体假死

    自己写的多线程进度条,避免主线程窗体假死的功能程序,有详细注释,可直接运行看结果,写给不懂线程知识的人使用的,不用有线程等编程基础,只需添加窗体进自己的程序,然后按照代码注释在对应地方添加自己的函数就...

    C# 实现的实时获取DOS输出结果程序

    为了避免阻塞主线程,把执行过程放在一个新的Thread中,防止了DOS执行中,C#窗口“假死”现象。 网上有个管道实现DOS输出的程序,没看懂,也不能编译,却被各网站,很多人转载。 CSDN上有个程序,可以捕获dos输出,...

    WinForm下多线程配合Invoke函数ping百度实例。

    WinForm下多线程配合Invoke函数ping百度和主线程ping百度对比。很容易就可以看出俩者的区别。

    .NET中基于事件的异步模式-EAP

    异步编程一直是比较复杂的问题,其中要处理多线程之间的数据同步、获取进度、可取消、获取结果、不影响主线程操作、多个任务之间互相不影响等,因此需要设计编程模型去处理此类问题。 从.NET 4.5开始,支持的三种...

    BaiduSpiderX.zip

    通过.NET C#实现对百度图片爬取的爬虫,用户只需要输入关键信息(如图片名字,...利用多线程download图片,支线程利用委托调用主线程控件 --4.通过流将图片文件下载到本地 注:程序仅供学习参考,禁止用于其他用途

    C#写gps中心服务处理程序

    //将线程作为后台线程处理,用途,当主线程关闭,子线程随着关闭 thGprs.Start( ); &lt;br&gt; try { IPHostEntry IPHost = Dns.Resolve(RemoteIp); string []aliases = IPHost.Aliases; ...

    C#全能速查宝典

    《C#全能速查宝典》共分为8章,分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表、GDI+绘图技术和C#高级编程,共包含562个C#编程中常用...

    C#异步调用的好处和方法分享

    主动回收和被动回收(当然,这是我自己的理解,微软可不是这么说的),主动回收就是,你去监视那个线程,并且等待,当异步方法完成了,就把异步线程回收,焦点回归主线程,实际上就是上篇文章《C#异步初步》的那种...

    AsyncUtils:一组用于Unity中异步编程的实用程序

    该库中的方法是线程感知的,将被推送到Unity主线程的同步上下文中以执行。 取消请求也以安全的方式进行。 安装 导航到“播放器设置”,并确保将“脚本运行时版本”设置为.NET 4.6等效项。 将Assets / Plugins文件夹...

Global site tag (gtag.js) - Google Analytics