如果一个C#的winform程序,主窗口创建一个前台线程,那么即使主窗口关闭了,这个线程乃至这个进程会继续运行。从逻辑上看你这句话就知道你理解错了。
.Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。  .net环境使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=false,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序。下面的代码演示了前台和后台线程的区别。

解决方案 »

  1.   

    .net里面的这个IsBackground概念,是.net framework自己提供的?
    不是,这个概念一直有,并非.net产生。
      一句话,后台线程在主线程完了后自动会退出的。
      

  2.   

    MFC中对线程分为“前台”和“工作者”线程,说白了,前台就是带界面的,工作者就是没界面的
      

  3.   

    net里面的这个IsBackground概念,是.net framework自己提供的,还是windows api的线程就具有的某种属性或者特性?
    ---------------------------------------------------------------------------------------------------------
    不清楚是不是.net framework自己提供的,但起码windows api的线程是不具备这种属性。
    windows api产生的线程都是工作线程,是独立运行的,跟exe或者主线程没什么关系,严格说唯一的关系就是如果主线程正常退出了,进程会结束,这个工作线程一般也会随着进程结束而结束。不管是CreateThread还是_beginthreadex都是这种。而MFC的AfxBeginThread这个不同,你看MSDN会发现AfxBeginThread有2种形式(具体看MSDN懒得贴了),这两种形式也对应了2种线程(UI线程和work线程)两者的唯一区别是前者有消息循环,但注意有消息循环并不一定有界面,4L的说法是错误的。当一个work线程调用了类似CreateWindow,GetMessage或者类似的API,那么work线程会产生消息循环,这时候work线程就变成了一个UI线程。