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