我试图更好地理解C#5中的线程.我有以下代码,如果我按F5(a和b似乎达到10)或按CTRL F5(a和b到3,我给出不同的结果)根据我正在研究的书中的文字)...有人可以解释一下原因吗?另外,我不明白为什么每个线程在10处停止,因为它似乎没有任何限制.是否有人可以向我解释这个问题?
using System;
using System.Threading;
namespace _70483.Chapter1
{
public static class Program
{
public static ThreadLocal<int> _field =
new ThreadLocal<int>(() =>
{
return Thread.CurrentThread.ManagedThreadId;
});
public static void Main()
{
new Thread(() =>
{
for (int x = 0; x < _field.Value; x++)
{
Console.WriteLine("Thread A: {0}", x);
}
}).Start();
new Thread(() =>
{
for (int x = 0; x < _field.Value; x++)
{
Console.WriteLine("Thread B: {0}", x);
}
}).Start();
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,我的机器在调试B中得到10和A到9.在没有调试器的版本中它是2和3.
这里没什么了不起的.您正在使用使用ManagedThreadId的线程本地数据,ManagedThreadId只是一个标识线程的数字.
在调试中,您可以看到应用程序的大量线程:
Not Flagged 14280 0 Worker Thread <No Name> Highest
Not Flagged 6180 3 Worker Thread <No Name> Normal
Not Flagged 4364 0 Worker Thread <No Name> Normal
Not Flagged 5484 7 Worker Thread vshost.RunParkingWindow [Managed to Native Transition] Normal
Not Flagged 4040 8 Worker Thread .NET SystemEvents [Managed to Native Transition] Normal
Not Flagged 6688 9 Main Thread Main Thread MT.Program.Main Normal
Not Flagged > 13472 10 Worker Thread <No Name> MT.Program..cctor.AnonymousMethod__4 Normal
Not Flagged 12240 11 Worker Thread <No Name> MT.Program.Main.AnonymousMethod__1 Normal
Run Code Online (Sandbox Code Playgroud)
在发布中没有附加vshosting进程,并且其他一些线程也不存在,因此你得到一个更小的线程ID,但你永远不应该得到A和B相同
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |