【发布时间】:2016-06-17 21:58:12
【问题描述】:
我有一个控制台应用程序,它使用 fileSystemWatcher 来监视新文件的映射网络路径。当文件出现时,它们会根据文件的内容进行重命名。我希望它 24/7 运行。它在一段时间内工作得很好,但我发现一段时间后控制台“暂停”并且似乎正在等待输入。如果我在控制台中点击返回,应用程序似乎赶上了所有似乎一直处于“待定”等待某种类型输入的事件。我似乎永远无法重现此问题以在暂停或原因的代码中捕获它。
我认为这与文件系统监视器由于外部因素(服务器重新启动、网络问题等)而失去监视网络路径的能力有关,因此我每 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);
}
【问题讨论】:
-
您是否可以在控制台中使用鼠标选择文本?
-
你有一个带有
getInput()的无限递归程序。如果你不走运并且编译器决定不进行尾递归,你最终会得到一个 StackOverflow。只需使用while(true)循环即可。 -
没有。这会在这种行为发生之前运行,有时会运行一天左右,而且任何人都无法做到这一点。
-
Scott- 好点,但如果有溢出能解释我所看到的吗?
-
注意:在你做
TheWatcher.Dispose();之前,先解绑事件TheWatcher.Changed -= theWatcher_Changed;,否则对象会因为事件而存活。
标签: c#