私はfileSystemWatcherを使って新しいファイルのマップされたネットワークパスを監視するコンソールアプリケーションを持っています。ファイルが表示されると、ファイルの内容に基づいて名前が変更されます。私はこれを24時間365日実行します。それは一度はうまく動作しますが、しばらくするとコンソールが "一時停止"し、入力を待っているように見えます。コンソールでリターンすると、アプリケーションはあるタイプの入力を待っている "保留中"だったすべてのイベントに追いついているようです。私はこの問題を再現して一時停止しているコードやその理由をコード内で捕まえることはできません。コンソールアプリケーション "pausing" c#
これは、ファイルシステムウォッチャーが外部要因(サーバーの再起動、ネットワークの問題など)によってネットワークパスを監視できなくなっていると想定していましたので、ファイルシステムウォッチャーを30分再作成します。私は実際には今の状況とはまったく関係がないと確信しています。
私が見ているのは、コンソールが見つけた新しいファイルの更新を喜んで印刷していることですが、それだけで停止します(出力だけでなくプログラムの操作)コンソールアプリケーションにフォーカスを当ててキーを押すまで(タイマーの経過やファイルシステムウォッチャーの再作成など)すべてのイベントが発生します。
質問は次のとおりです:なぜこれが起こっているのですか?それをどうやって防ぐのですか?プログラムのナットとボルトは次のようになります
:(GetInput()
でGetInput()
を呼び出すことによって引き起こす可能性がある)StackOverflowの例外を取り除くために
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)'ループを使用してください。 –
いいえ、これは、この現象が起こる前に、時には1日ほど実行され、誰もそれを行うことができません。 – rune711