我将创建这样的线程:
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();
}
错在哪里?
答案 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核心数的另一台计算机上运行程序,结果可能会有所不同。如果您希望每台计算机上都有某些特殊行为,则必须同步线程