У меня есть консольное приложение, которое использует fileSystemWatcher для отслеживания сопоставленного сетевого пути для новых файлов. Когда файлы появляются, они переименовываются на основе содержимого файлов. Я хочу, чтобы это продолжалось 24/7. На какое-то время это работает нормально, но я обнаружил, что через некоторое время консоль «приостанавливается» и, кажется, ждет ввода. Если я нажму на возврат в консоли, приложение, похоже, догонит все события, которые, похоже, находятся в ожидании ожидающего ввода какого-либо типа. Я никогда не могу воспроизвести эту проблему, чтобы поймать ее в коде, где она приостанавливается или почему.Консольное приложение «приостановка» C#
Я предположил, что это связано с тем, что наблюдатель файловой системы потерял способность отслеживать сетевой путь из-за внешних факторов (перезагрузка сервера, проблемы с сетью и т. Д.), Поэтому я воссоздал наблюдателя файловой системы за 30 минут. Я почти уверен, что на самом деле сейчас не имеет ничего общего с ситуацией.
По сути, я вижу, что консоль успешно распечатывает обновления для найденных новых файлов и т. Д., Но тогда это просто прекратится (работа с программой, а не только выход) и никогда не будет продолжаться, до тех пор, пока я не сосредоточусь на консольном приложении и не нажму на какой-то ключ, а затем все ожидающие события (например, истечение таймера и повторные создания наблюдателей файловой системы).
Вопрос в том, почему это происходит и как его предотвратить?
Гайки и болты программы выглядит следующим образом:
static void Main(string[] args)
{
RefreshTimer = new Timer(1800000); //30 minutes
RefreshTimer.Elapsed += RefreshTimer_Elapsed;
RefreshTimer.Enabled = true;
writeHelp();
reCreateWatcher();
getInput();
}
private static void writeHelp()
{
Console.WriteLine("HELP:");
Console.WriteLine(@"");
Console.WriteLine("RENAMES FILES THAT ARE PLACED INTO THE WORKING FOLDER.");
Console.WriteLine("*************_Commands:_************");
Console.WriteLine("'runAll' = will run the program on all files curently existing in the folder. Note that if a file has already been renamed the program SHOULD attempt the rename, find the file has already been renamed, and move to the next file.");
Console.WriteLine("'quit' = exits program");
Console.WriteLine("'help' = shows this spiffy information.");
Console.WriteLine("[end]");
Console.WriteLine("");
}
private static void getInput()
{
Console.Write("Cmd ->");
string k = Console.ReadLine();
switch (k)
{
case "help":
writeHelp();
break;
case "runAll":
string[] allFiles = System.IO.Directory.GetFiles(PATH_TO_FILES);
foreach (string curr in allFiles)
{
parseTheFile(curr);
}
break;
case "quit":
return;
default:
Console.WriteLine("Huh? Unknown command!");
break;
}
getInput();
}
private static void reCreateWatcher()
{
Console.WriteLine("re-starting watcher...");
Console.WriteLine("Starting Monitor of: " + PATH_TO_FILES);
if (TheWatcher != null)
{
TheWatcher.Dispose();
}
deleteOldFiles();
try
{
TheWatcher = new FileSystemWatcher(PATH_TO_FILES, "*.pdf");
}
catch (Exception ex)
{
Console.WriteLine("AN ERROR OCCURED WHEN TRYING TO SET UP THE FILE SYSTEM WATCHER ON, '" + PATH_TO_FILES + "'. THE ERROR WAS: " + ex.Message);
Console.WriteLine("Hit any key to exit.");
Console.ReadKey();
Environment.Exit(0);
}
TheWatcher.NotifyFilter = NotifyFilters.LastWrite;
TheWatcher.Changed += theWatcher_Changed;
TheWatcher.EnableRaisingEvents = true;
}
static void theWatcher_Changed(object sender, FileSystemEventArgs e)
{
Console.WriteLine("New file found: " + e.Name);
parseTheFile(e.FullPath);
}
Возможно ли, что вы выбрали текст с помощью мыши в консоли? – recursive
У вас есть бесконечно рекурсивная программа с 'getInput()'. Если вам не повезет, и компилятор не выполнил рекурсию хвоста, вы, в конце концов, получите StackOverflow. Просто используйте вместо этого цикл while (true). –
Нет. Это будет происходить, иногда в течение дня или около того, до того, как это произойдет, и никто не сможет этого сделать. – rune711