Не дубликат. Код, приведенный ниже, также зависает и заставляет консоль ожидать ввода «случайным образом» - где-то еще большая проблема.
int i = 0;
while (true)
{
Console.WriteLine(++i);
System.Threading.Thread.Sleep(3000);
}
Так что у меня самая странная ошибка, и, кажется, ничто в Интернете никогда не имеет этого. Недавно я переместил свой планировщик задач на другой сервер (стандарт Windows Server 2016), и после этого приложение, кажется, случайно зависает на строке Task.Delay и никогда не запускается после нее.
Например, он просто скажет «Проверка завершена при следующем запуске в 09:31», и никогда больше не будет выполняться.
Интересно, что нажатие клавиши ввода в окне консоли запускает его выполнение, однако затем каждый раз, когда оно зависает в спящем режиме, пока приложение не закроется и не откроется заново.
Это может продолжаться много дней, не сталкиваясь с этой проблемой, а затем, по-видимому, случайно возникнет.
Я пробовал использовать Thread.Sleep вместо Task.Delay, и у обоих возникла одна и та же проблема. Я также добавил проверку, чтобы проверить, не зависла ли команда Directory.Exists, поэтому вместо этого сохранил каталоги в памяти.
Я понятия не имею, что может быть причиной этого - я никогда не испытывал ничего подобного раньше. Есть идеи?
Код приведен ниже - однако его невозможно будет воспроизвести, если представить его из-за странной природы ошибки
TLDR:
Консольное приложение Windows Server 2016 зависает на Task.Delay (и Thread.Sleep) до тех пор, пока в окне консоли не будет нажата клавиша
// This is the main execution loop
while (true)
{
Task run = checkDirectoriesForAppsToRun();
run.Wait();
}
static async Task checkDirectoriesForAppsToRun()
{
Console.WriteLine("Starting apps...");
foreach (string subFolder in listOfSubfolders)
{
if (directoryExists.ContainsKey(currentDirectory + @"\" + subFolder) || System.IO.Directory.Exists(currentDirectory + @"\" + subFolder)) // Only if the sub directory exists!
{
if (directoryExists.ContainsKey(currentDirectory + @"\" + subFolder) == false)
directoryExists.Add(currentDirectory + @"\" + subFolder, true);
foreach (string directory in System.IO.Directory.GetDirectories(currentDirectory + @"\" + subFolder))
{
CheckDirectoryForApp(directory); // Load the apps xml file, and check if we need to run it.
}
}
else
{
Console.WriteLine(subFolder + " Doesn't exist in the root directory - Please check");
}
}
Console.WriteLine("Check completed next run at " + DateTime.Now.Add(timeToPause).ToShortTimeString());
await Task.Delay(timeToPause);
}