我有一个应用程序可以监视目录的更改。创建文件(日志文件)时,它会分析其内容,将结果写入表单(该表单已存在并已初始化,尽管当前可能隐藏),最后将该表单显示给用户。
当应用程序启动时,任务栏中只显示一个图标。main 方法只是在任务栏中创建图标,并用结果初始化监视/分析和控制表单的类。
public static void Main(string[] args) {
NotificationIcon notificationIcon = new NotificationIcon();
notificationIcon.notifyIcon.Visible = true;
if (notificationIcon.Init()) {
MainForm = ResultForm.GetInstance();
Application.Run();
}
}
“ResultForm”就是我刚才提到的那个类,有以下与问题相关的方法:
public static ResultForm GetInstance() {
// _this is an attribute from the class. Is used to work always
// with just one instance of the classe
if (_this==null)
_this= new ResultForm();
return _this;
}
private ResultForm() {
// initialization of the GUI form
InitializeComponent();
[...]
// watcher for the log files
logsWatcher= new FileSystemWatcher(LOGFILES_FOLDER);
logsWatcher.Created += new FileSystemEventHandler(NewFile);
logsWatcher.EnableRaisingEvents=true;
logsWatcher.SynchronizingObject = this;
}
private void NewFile (object source, FileSystemEventArgs e) {
// make sure the file is of the correct type
[...]
// perform some analysis on the file
[...]
// update the contents in the form (some TreeViews and labels)
[...]
// show the form to the user
_this.Show();
}
现在问题来了。如果应用程序启动,分析了一个文件并且尚未显示主窗体,则在分析完成时将显示为“未响应”,尽管一切都已完成。如果之后创建了一个新文件,它将被成功分析,尽管表单将保持这种“无响应”状态。
但是,如果自应用程序启动后表单至少打开过一次(例如,您双击图标,显示表单并关闭它(或保持打开状态,没关系)),一切都会工作顺利。
作为一种变通方法,我可以使用以下两行(在Run()
方法之前)修改 main ,因此在任何文件到来之前表单将至少显示一次:
MainForm.Show();
MainForm.Hide();
(我将其隐藏起来,因为在执行分析或用户明确单击图标之前它不可见。)除此之外,程序没有区别:所做的工作是相同的,形式是一切完成后始终显示。我已使用调试器确保在执行期间到达方法的末尾。
如果没有提到的解决方法,我该如何解决这个问题?
我尝试创建一个用于分析的线程,使用Application.DoEvents()
类似于此的代码块。在最好的情况下,表单会正确显示其所有内容,但仍处于“未响应”状态。我还尝试让Show()
方法中的调用得到完全相同的结果,这告诉我这不是负载过重的问题,而是我可能做错了什么。
编辑 由于@thecoon 要求,我上传了一个重现问题的小项目。它已经用 SharpDevelop 完成,以防你也使用它。--> http://dl.dropbox.com/u/1153417/test.zip
Main() 方法中有一个小解释。