【发布时间】:2009-08-03 16:00:54
【问题描述】:
我创建了一个控制台测试应用程序,它创建一个对象并在 2 个单独的线程上调用 2 个函数。 一个线程以相反的顺序打印从 1 到 20 的数字。
问题是在调试第一个工作线程时直到我不停止调试主线程(即我按 f5)才被触发。有答案吗?
class Program
{
static void Main(string[] args)
{
DisplayData dd = new DisplayData();
ThreadStart ts1 = new ThreadStart(dd.DisplayNumber);
Thread t1 = new Thread(ts1);
t1.Name = "Display Numbers";
ThreadStart ts2 = new ThreadStart(dd.ReverseNumbers);
Thread t2 = new Thread(ts2);
t2.Name = "Reverse Numbers";
t1.Start(); //Keep 1st break point at this location. Then press F10.
t2.Start(); //Keep break point at this location permanently
}
public class DisplayData
{
public void DisplayNumber()
{
int length = 20;
Console.WriteLine("\nNumbers in correct order.\n");
for (int i = 0; i < length; i++)
{
Console.WriteLine("DN: The value of i is: " + (i+1) + " " + Thread.CurrentThread.ManagedThreadId + " " + Thread.CurrentThread.Name);
//Thread.Sleep(1000);
}
}
public void ReverseNumbers()
{
int length = 20;
Console.WriteLine("\nNumbers in reverse order.\n");
for (int i = 0; i < length; i++)
{
Console.WriteLine("RN: The value of i is: " + (length - i) + " " + Thread.CurrentThread.ManagedThreadId + " " + Thread.CurrentThread.Name);
//Thread.Sleep(1000);
}
}
【问题讨论】:
-
sDisplayNumber 和 ReverseNumbers 长什么样子?
-
一个问题是不能保证线程何时开始,如果你降级到 t2.Start(),那么 t1 可能还没有开始,但是因为你在那条线上暂停什么会发生。也许如果你在 t1.Start() 和 t2.Start() 之间放置一条线来检查线程是否启动,然后启动 t2 会更好。
-
如果在 t1.Start() 和 t2.Start(0 之间放置 Console.ReadKey() 则 t1 执行。
标签: c# multithreading