#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);
(Надеюсь, я правильно это запомнил.)
Таймеры не используют потоки, и они вызывают обратный вызов в фоновом потоке-пуле потоков. Они не поддерживают процесс в рабочем состоянии.