如下代码       public static class Debug
{
       static Debug()
        {
            var thread = new Thread(() =>
            {
                int i = 3;                             
                MessageBox.Show("end");
            });
            thread.IsBackground = true;
            thread.Start();
            Thread.Sleep(3000);
            while (true)
                Thread.Sleep(1000);           
        }        
}thread的ThreadState始终是Background , 而且无法进入线程。
如果去掉 while ,就可以
或者不去掉while,去掉IsBackground 也可以。
糊涂了

解决方案 »

  1.   

    你的线程没有消息处理循环,所以本来不应该打开任何窗口,MessageBox.Show("end")会打开窗口,所以你说的“无法进入线程”,是不是指MessageBox没有显示?其实如果你没看到MessageBox显示,不一定没有进入线程,只是线程无法正确显示界面而已,你把MessageBox换成控制台输出,比如Console.WriteLine("end"),可能结论就不一样,
      

  2.   


    while (true){
       Thread.Sleep(1000);   
       Application.DoEvents();
    }加上一句在试下,应该可以执行到的
      

  3.   


    是的,在非static中完全没问题,我也试过了,但是在static中就有问题,我还在测试
      

  4.   

    这几天也遇到过
    线程属性设置为IsBackground = true后
    线程起不来
    不够还没时间跟踪下情况
    楼主解决了
    贴出来分享下
      

  5.   

    嗯,好的,我会测试的。
    而且一定要是static才有这个问题。
    似乎很奇怪,在找国外这方面的资料
      

  6.   


    额,不是你说的这样, Debug模式也进不去 int i = 3 这行。 ThreadState显示 Background
    而且是Winform模式,不是Console模式。
    另外, 有个问题求教, 
    MessageBox 内建消息循环(Win32:GetMessage()) ,同时是模态显示, 
    应该不需要外接支持,
    为何您会说没有消息循环?
      

  7.   


    using System;
    using System.Reflection;using System.Threading.Tasks;
    using System.Threading;
    using System.Collections.Generic;using norlib;
    using System.Windows.Forms;
    namespace csdnHelper
    {
        public class Example
        {
            public Example()
            {
               MessageBox.Show(ClassBTLocal.Number.ToString());          
            }     
        }
        public static class ClassBTLocal
        {
            static ClassBTLocal()
            {
                bool bEnd = false;
                var thread = new Thread(() =>
                {
                    bEnd = true;//尝试注释此句
                    int i = 3;
                    MessageBox.Show("end");
                });           
                thread.IsBackground = true;//尝试注释此句
                thread.Start();
                while (bEnd)
                    ;// Thread.Sleep(1000);
            }
            public static int Number = 123;   
        }
    }大家看看是怎么回事。
    如果ThreadProc里面没有 bEnd 这个内部变量,线程就不会运行,还有IsBackground
      

  8.   

    我试了顶楼和8L的代码,和bEnd,IsBackground这些无关,加上去掉都没什么影响。我是这么分析的:
    CLR要求类型被访问前静态构造函数被执行一次:如果线程尝试访问某个类型时,静态构造函数还没有开始执行,那么当前线程就执行类型的静态构造函数;如果类型的静态构造函数正在被其他某条线程执行,当前线程会阻塞,等待静态构造函数执行完毕。
    所以,如果静态构造函数中发生了阻塞,所有其他线程中对该类型的访问都会被阻塞。LZ的代码在静态构造函数中启动了新线程,新线程又试图访问当前类型,所以新线程要等到静态构造函数执行完毕才能继续执行。而LZ又不让静态构造函数退出,所以新线程就无法继续执行。为什么LZ的代码访问了当前类型呢?C#在编译lambda表达式的时候会把它编译为当前类型的一个函数,既然是当前类型的函数,执行这个函数当然就是对类型的访问。LZ可以试试,把线程要执行的代码定义在其他类型中,就不会出现这种情况了。
      

  9.   


    我在怀疑静态构造函数,但现用2005 用不连LAMbda表达式无法验证 不过同意9L  
    LZ可改成普通静态方法试试
      

  10.   

    辛苦了。我的环境是2012.
    Lambda产生的匿名函数,您说”C#在编译lambda表达式的时候会把它编译为当前类型的一个函数“,我记得不是这样,他是做了一个static的函数,和实例没有关系。(当然,如果你用到了实例里面的field,property,那么这个匿名函数会把实例的this传入,但是,匿名函数仍然是一个static函数)
    我会尝试反汇编一下
      

  11.   

    构造函数没有退出,阻塞了 while (true)//注释掉这句
                    Thread.Sleep(1000);           
      

  12.   


    线程的启动和构造函数阻塞有关系?
    可是我如果在ThreadProc里面加上 bEnd = true
    即使阻塞也能跑啊。
      

  13.   

    http://www.cnblogs.com/nnhy/archive/2011/03/15/cctor.html