线程创建和开始

时间:2013-06-04 20:08:21

标签: c# multithreading

我将创建这样的线程:

static void Main(string[] args)
{            

    Thread tr2 = new Thread(() =>
    {
        int a = 0;

        Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
    });


    tr2.Start();

    Console.ReadKey();
}

但是tr2无法启动,它会在ReadKey()方法之后启动,当我将第一行添加到Main方法时,tr2会在ReadKey()之前启动{1}}方法:

static void Main(string[] args)
{
    Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);



    Thread tr2 = new Thread(() =>
    {
        int a = 0;

        Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
    });



    tr2.Start();

    Console.ReadKey();
}

错在哪里?

3 个答案:

答案 0 :(得分:2)

http://msdn.microsoft.com/en-us/library/471w8d85.aspx

  

ReadKey方法等待,即发出的线程上的块   ReadKey方法,直到按下字符或功能键。一个   字符或功能键可以与一个或组合按下   更多Alt,Ctrl或Shift修饰键。但是,按下修饰符   key本身不会导致ReadKey方法返回。

我认为ReadKey会阻止Console的执行,尝试在此行添加断点:

int a = 0;

线程应该启动并且会中断。

问题是:主线程在执行Console.ReadKey正在等待事件而第二个线程想要在同一个控制台中写一行。它不兼容,结果取决于计算机。

答案 1 :(得分:2)

Console.ReadKey()获取Console类中内部对象的锁定,称为Console.InternalSyncObject

简而言之,这意味着Console.WriteLine将在执行之前等待释放锁定 - 正如您可能已经猜到的那样,只要您按下某个键,就会释放锁定。

答案 2 :(得分:1)

  

错误在哪里?

没有错。这种行为只是偶然的。如果在具有不同CPU核心数的另一台计算机上运行程序,结果可能会有所不同。如果您希望每台计算机上都有某些特殊行为,则必须同步线程