Почему моя заметка о коде создает 4 отдельных потока с разными интервалами?

#c# #multithreading #.net-4.0

#c# #многопоточность #.net-4.0

Вопрос:

Я хочу сгенерировать 4 отдельных потока, которые записывают данные в консоль.

Я думал, что этот код будет выполнять процесс через n интервалов, что означает, что первый Console.WriteLine будет выполняться через 1 минуту, второй через 4 минуты и так далее.

 private static void CopyFiles()
{
    string strCmdText;
    strCmdText= @"xcopy C:UsersMeDocumentsFiles*.* C:UsersMeDocumentsFilesJustTest";
    System.Diagnostics.Process.Start("CMD.exe",strCmdText);
}       
static void Main(string[] args)
{
    TestThreads();
}
static void TestThreads()
{
    Console.WriteLine("Begin TestThreads");
    int firstQtr = 1;
    int secondQtr = 4;
    int thirdQtr = 6;

    if (firstQtr >= 0)
    {
        System.Threading.Timer t0 = new Timer((s) =>
        {
            CopyFiles();
        }, null, TimeSpan.FromMinutes(firstQtr), TimeSpan.FromMilliseconds(1));
    }
    if (secondQtr >= 0)
    {
        System.Threading.Timer t1 = new Timer((s) =>
        {
            for (; ; )
            {
                Console.WriteLine("Started at: "   DateTime.Now.ToString());
            }

        }, null, TimeSpan.FromMinutes(secondQtr), TimeSpan.FromMilliseconds(1));
    }
    if (thirdQtr >= 0)
    {
        System.Threading.Timer t2 = new Timer((s) =>
        {
            for (; ; )
            {
                Console.WriteLine("Started at: "   DateTime.Now.ToString());
            }

        }, null, TimeSpan.FromMinutes(thirdQtr), TimeSpan.FromMilliseconds(1));
    }
}
  

Я не вижу никаких выходных данных в окне консоли, ни при отладке, ни при запуске непосредственно из командной строки.

Что я делаю не так?

Комментарии:

1. Разве таймеры не запускаются в конструкторе с TimeSpan.FromMinutes(int) ? В этом случае через 4 минуты System.Threading.Timer t1 начнется выполнение.

2. Поскольку ни один из делегатов не завершится, период в 1 мс не очень важен.

3. Командная строка немедленно завершается? или он сидит там, ничего не выводя. В принципе, можете ли вы показать нам код, который вызывает TestThreads() ?

4. Это консольное приложение, выглядит примерно так: static void Main(string[] args) { TestThreads(); }

5. Ваша основная программа не ожидает потоков, она просто завершает работу. Это останавливает процесс со всеми его потоками.

Ответ №1:

Когда основной метод завершает работу, завершается единственный поток (переднего плана) в процессе. Когда это происходит, среда CLR завершает процесс. Сделайте ваш основной метод активным, например, остановив его:

 Thread.Sleep(Timeout.Infinite);
  

(Надеюсь, я правильно это запомнил.)

Таймеры не используют потоки, и они вызывают обратный вызов в фоновом потоке-пуле потоков. Они не поддерживают процесс в рабочем состоянии.