2

我将创建这样的线程:

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()

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();
}

错在哪里?

4

3 回答 3

2

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

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

我认为ReadKey阻止执行Console,尝试在这一行添加一个断点:

int a = 0;

线程应该开始并且会中断。

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

于 2013-06-04T20:19:33.510 回答
2

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

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

于 2013-06-04T20:22:35.970 回答
1

错在哪里?

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

于 2013-06-04T20:18:22.363 回答