Я создал консольное тестовое приложение, которое создает объект и вызывает 2 функции на 2 отдельных потоках. Один поток отпечатывает числа, образующие 1- 20, в обратном порядке.
Проблема заключается в том, что при отладке 1 рабочий поток не запускается, пока я не прекращу отладку основного потока (т.е. нажмите 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);
}
}
Я не уверен, что это ограничение в Visual Studio или CLR, но установка точки останова на одном потоке остановит все потоки.
Если вы хотите приостановить поток, вы можете сделать это через окно Debug..Threads, вы можете приостановить и возобновить там темы.
Работа над другой угрозой не запускается до тех пор, пока не произойдет переключение контекста. Это может легко пройти через всю работу в вашей основной программе, прежде чем процессор решит начать что-то еще.
Используйте t1.Join()
, чтобы ждать завершения рабочего потока, прежде чем продолжить.
Ну, он "выполняет", но не обязательно получает временный фрагмент. Когда вы один шаг через свой код, все потоки эффективно "выполняются". Однако фактическое количество работающих потоков зависит от доступных ЦП. Поэтому в зависимости от обстоятельств ваши другие потоки могут работать или не работать.
Поскольку среда .NET синхронизирует доступ к стандартным выводам, только один из ваших потоков будет удерживать данную блокировку в любое время, что может создать впечатление, что другие потоки не запускаются.
Вы обнаружите, что если вы продолжаете переходить через код основного потока, он в конечном итоге переключится на один из ваших рабочих потоков.
Но самое простое в вашей ситуации - разместить точку прерывания в первой строке DisplayNumber и ReverseNumbers, если это то, что вы специально хотите отлаживать.