我有一個應用程序監視目錄的變化。當一個文件(一個日誌文件)被創建時,它會分析它的內容,將結果寫入一個表單中(它已經存在並且已經被初始化,儘管可能已經隱藏了),並且最終將這個表單顯示給用戶。如果在之前沒有顯示過,請填寫「無響應」
當應用程序啓動時,只有一個圖標顯示在任務欄中。主要方法只是在任務欄中創建圖標,並初始化觀察/分析並用結果控制表單的類。
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();
}
現在問題來了。如果應用程序啓動,則會分析文件,並且尚未顯示主窗體,但分析完成後將顯示爲「未響應」,但所有操作都已完成。如果之後創建了新文件,它將被成功分析,但表單將保持此「無響應」狀態。但是,如果表單在應用程序啓動之前至少打開過一次(例如,您雙擊圖標,表單就會顯示出來並關閉它(或者將其打開,這並不重要) ),一切都會順利進行。
作爲workaroud,我可以修改主要具有以下兩個線(Run()
方法之前),所以任何文件來之前的形式將顯示至少一次:
MainForm.Show();
MainForm.Hide();
(I隱藏它因爲在執行分析或用戶明確點擊圖標之前它不應該是可見的。) 除此之外,程序沒有區別:所做的工作是相同的,並且表單總是顯示一次一切都完成了。我已經確定調試器在執行期間達到了方法的結束。
如何解決這個問題,而沒有提到的解決方法?
我曾嘗試使用Application.DoEvents()
或與this one類似的代碼塊創建分析線程。在最好的情況下,表單正確顯示其所有內容,但保持「未響應」狀態。我也嘗試在方法中保留Show()
調用的結果,它告訴我這不是一個重負載的問題,但是我可能做錯了某些事情。
編輯 由於@thecoon要求它,所以我上傳了一個能夠重現問題的小型項目。已經用SharpDevelop完成了,以防你也使用它。 - >http://dl.dropbox.com/u/1153417/test.zip
Main()方法中有一個小的解釋。
你可以在某處上傳一個能夠再現問題的最小樣本嗎? –
您是否嘗試過在單獨的線程中分析日誌?這是防止未定義UI – undefined
凍結的常用方法,正如我在最後一段中提到的,是的,我已經嘗試過,但結果是相同的。 @thecoon,我會嘗試上傳一個樣本,只要我有時間 – Solem