新浦京81707con > 注册购买 > 前台线程与后台线程的区别和联系,线程基础

原标题:前台线程与后台线程的区别和联系,线程基础

浏览次数:74 时间:2019-05-06

 

本文转自:

  .Net的公用语言运维时(Common Language Runtime,CL翼虎)能分别三种差异品类的线程:前台线程和后台线程。那两边的分别就是:应用程序必须运转完全体的前台线程才方可退出;而对此后台线程,应用程序则能够不思量其是不是已经运营达成而直接退出,全数的后台线程在应用程序退出时都会活动终止。

认知线程

先是来看看哪些成立线程:

  .net情形使用Thread建立的线程私下认可情形下是前台线程,即线程属性IsBackground=false,在经过中,只要有一个前台线程未脱离,进度就不会停下。主线程正是2个前台线程。而后台线程不管线程是还是不是停止,只要具有的前台线程都退出(包含健康退出和分外退出)后,进度就可以自行终止。一般后台线程用于拍卖时间相当的短的天职,如在多个Web服务器中得以采取后台线程来拍卖客户端发过来的呼吁音信。而前台线程一般用来拍卖须求长日子等待的天职,如在Web服务器中的监听客户端请求的先后,或是定期对有个别系统能源举行扫描的主次。上面包车型大巴代码演示了前台和后台线程的区分。

public static void Print()
        {
            for (int i = 0; i < 10; i  )
            {
                Thread.Sleep(1000);
                Console.WriteLine(i);
            }
        }
        public static void Print1()
        {
            for (int i = 0; i < 10; i  )
            {
                Console.WriteLine("i am first thread "   i);
            }
        }

 Console.WriteLine("Starting------------");

            Thread t = new Thread(Print);
            t.Start();

            Print1();

            Console.ReadKey();
Console.WriteLine(Process.GetCurrentProcess().Threads.Count);
Thread t1 = new Thread(() =>
    {
        Thread.Sleep(1000);
        Thread t = Thread.CurrentThread;
        Console.WriteLine("Name: "   t.Name);
        Console.WriteLine("ManagedThreadId: "   t.ManagedThreadId);
        Console.WriteLine("State: "   t.ThreadState);
        Console.WriteLine("Priority: "   t.Priority);
        Console.WriteLine("IsBackground: "   t.IsBackground);
        Console.WriteLine("IsThreadPoolThread: "   t.IsThreadPoolThread);
    })
    {
        Name = "Thread1",
        Priority = ThreadPriority.Highest
    };
t1.Start();
Console.WriteLine(Process.GetCurrentProcess().Threads.Count);
public static void myStaticThreadMethod()
{
    Thread.Sleep(3000);
}
Thread thread = new Thread(myStaticThreadMethod);
// thread.IsBackground = true;
thread.Start()

图片 1

小编们在Thread的构造方法中流传3个Lambda表达式,对应ThreadStart委托(无参void再次回到值的办法)来组织3个线程任务。那段程序中有多少个注意点:

假设运维方面包车型客车代码,程序会等待3秒后退出,假使将注释去掉,将thread设成后台线程,则程序会马上退出。要留心的是,必须在调用Start方法从前设置线程的品类,不然1但线程运维,将不可能改观其品种。

因为新开发银行的线程里会苏息一下,所以必然是主线程的章程先进行,

一)从出口结果中能够看看,当前程序运营后就三八个线程,新开线程后浮现为伍个线程,在线程方法中休眠了一秒,防止主线程施行完次线程就过早甘休了。

  通过BeginXXX方法运转的线程都现在台线程,启动了八个线程的程序在关闭的时候却出现了难题,如若程序退出的时候不停业线程,那么线程就能够一向的留存,可是基本上运营的线程都以部分变量,无法挨个的关门,假设调用Thread.CurrentThread.Abort()方法关闭主线程的话,就能够油可是生ThreadAbortException 格外,因而那样尤其。后来找到了那个措施: Thread.IsBackground设置线程为后台线程。

 

二)大家可以为线程设置2个名字,方便调节和测试。大家也能够设置线程的优先级,那几个在之后会有更进一步介绍。

 

借使想让新运营的线程实行完再去实施主线,也正是让主线程等待,能够用 join

三)第十行,托管线程的唯一标志符,微软指出利用托管线程的Id而不是操作系统中线程的Id来追踪线程。

  转自 

 Console.WriteLine("Starting------------");

            Thread t = new Thread(Print);
            t.Start();
            t.Join();  //阻塞后面的线程,一直等到它完成。
            Print1();

            Console.ReadKey();

肆)第七行代码输出了如今线程不是后台线程,也正是是前台线程,这是暗许值。进度会等待前台线程截至结束,而如若是后台线程的话,全体前台线程截至后后台线程自动结束。对于Windows GUI应用程序来讲,使用后台线程极大概产生奇怪现象,也正是在程序从职责管理器的应用程序壹栏中消灭后其经过还在,只能通过手动终止进度来刑满释放解除劳教内部存款和储蓄器。

图片 2

五)第2壹行代码注解那么些线程不是由线程池创设的,有关线程池见后文的介绍。

 

 图片 3

突发性感觉新开发银行的线程有点不听话,干脆干掉吗,让它活1会曾经够意思了,能够用Abort,然则这几个轻易出标题,不建议采取。

那么大家再来看看怎么着为线程传入参数,一种格局是行使相配ParameterizedThreadStart委托(object参数void重临值)的不二等秘书籍:

  Console.WriteLine("Starting------------");

            Thread t = new Thread(Print);
            t.Start();
            Thread.Sleep(5000);
            t.Abort();//干掉线程,容易引发异常,不建议使用
            Print1();

            Console.ReadKey();
new Thread((date) => Console.WriteLine(((DateTime)date).ToString())).Start(DateTime.Now);

图片 4

鉴于参数是object类型的,我们在应用的时候只得进行转移,而且还有3个难点便是不匡助多少个参数,假设要八个参数的话只可以采纳自定义的目的进行打包,大家还足以行使别的一种办法,那就是利用二个无参方法来包装线程方法主体:

 

new Thread(() => Add(1, 2)).Start();

static void Add(int i, int j)
{
    Console.WriteLine(i   j);
}

线程是有内外之分的,暗中同意展现成立的线程都以前台线程,而进度会等待全体的前台线程停止后自行关闭程序,不管后台线程的坚毅,不过只要程序定义了三个千古不会实行完的线程那么就能够等待后台线程实施完了,举例Console.ReadKey(),是啊,哈哈

上述几行代码的运转结果如下:

 Console.WriteLine("Starting------------");

            Thread t = new Thread(Print);
            t.Start();
            t.IsBackground = true;
            Print1();

            //Console.ReadKey();

图片 5 

本文由新浦京81707con发布于注册购买,转载请注明出处:前台线程与后台线程的区别和联系,线程基础

关键词: 新浦京81707con C# .Net 多线程

上一篇:几款比较常用的翻转特效

下一篇:没有了