我创建了一个控制台测试应用程序,它创建了一个对象&在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);
}
}
答案 0 :(得分:6)
我不确定这是否是Visual Studio或CLR中的限制,但在一个线程上设置断点将停止所有线程。
如果你想暂停一个线程你可以通过Debug..Threads窗口执行此操作,你可以在那里暂停和恢复线程。
答案 1 :(得分:2)
在发生上下文切换之前,不会开始处理其他威胁。在CPU决定开始其他工作之前,它可以很容易地完成主程序中的所有工作。
在继续之前使用t1.Join()
等待工作线程完成。
答案 2 :(得分:1)
你会发现,如果你继续单步执行主线程代码,它最终会切换到你的一个工作线程。
但在你的情况下最简单的做法是在 DisplayNumber 和 ReverseNumbers 的第一行放置一个断点,如果这是你特别想调试的那个。
答案 3 :(得分:1)
它确实“执行”,但它不一定得到任何时间片。当您单步执行代码时,所有线程都会有效地“执行”。但是,实际运行的线程数取决于可用的CPU。因此,根据具体情况,您的其他线程可能会运行也可能不运行。
由于.NET框架会同步对标准输出的访问,因此任何时候只有一个线程会持有该锁,这可能会让您觉得其他线程不会运行。