ディレクトリの変更を監視するアプリケーションがあります。ファイル (ログ ファイル) が作成されると、その内容を分析し、結果をフォーム (既に存在し、初期化されていますが、現在は非表示になっている可能性があります) に書き込み、最後にこのフォームをユーザーに表示します。
アプリケーションが起動すると、タスクバーにアイコンだけが表示されます。メイン メソッドは、タスク バーにアイコンを作成し、結果を使用してフォームを監視/分析および制御するクラスを初期化するだけです。
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();
}
そして今、問題が発生します。アプリケーションが起動し、ファイルが分析され、メイン フォームがまだ表示されていない場合、分析が完了すると、すべてが既に行われているにもかかわらず、「応答していません」と表示されます。後で新しいファイルが作成された場合、フォームはこの「応答なし」状態のままですが、正常に分析されます。
ただし、アプリケーションが開始されてからフォームが少なくとも 1 回開かれている場合 (たとえば、アイコンをダブルクリックし、フォームが表示され、フォームを閉じた場合 (または開いたままにしている場合でも問題ありません))、すべてがスムーズに動作します。
回避策として、次の 2 行 (Run()
メソッドの前) でメインを変更できるため、ファイルが来る前にフォームが少なくとも 1 回表示されます。
MainForm.Show();
MainForm.Hide();
(分析が実行されるか、ユーザーが明示的にアイコンをクリックするまで表示されないようにするため、非表示にします。) それ以外は、プログラムに違いはありません。実行される作業は同じで、フォームは次のとおりです。すべてが完了すると、常に表示されます。実行中にメソッドの最後に到達することをデバッガーで確認しました。
上記の回避策を使用せずにこの問題を解決するにはどうすればよいですか?
このApplication.DoEvents()
ようなコードのブロックまたはブロックを使用して、分析用のスレッドを作成しようとしました。最良の場合、フォームはすべてのコンテンツを適切に表示しますが、「応答なし」状態のままです。また、まったく同じ結果で呼び出しをメソッドに残そうとしましたが、これは負荷が高いという問題ではなく、間違っている可能性があることを示しています。Show()
EDIT @thecoon がリクエストしたので、問題を再現する小さなプロジェクトをアップロードしました。あなたもそれを使用する場合に備えて、それはSharpDevelopで行われました. --> http://dl.dropbox.com/u/1153417/test.zip
Main() メソッドに簡単な説明があります。