FileSystemWatcher を使用して新しいファイルのフォルダーを監視し、それらに対して何らかの処理を実行する、C# で記述された Windows フォーム アプリケーションがあります。私のアプリケーションはシステム トレイで実行するように設計されているため、起動時にフォームをインスタンス化しません。問題は、Created イベントが別のスレッドで発生し、Created イベントでフォームのインスタンスを作成しようとすると、SingleThreadApartment で実行する必要があることを示す ThreadStateException が発生することです。FileSystemWatcher.SynchronizingObject プロパティを設定する必要があると思いますが、アプリケーションにメイン フォームがないため、何を使用すればよいかわかりません。
3562 次
3 に答える
6
FileSystemWatcher がメイン スレッドへの呼び出しを適切にマーシャリングできるように、Main() メソッドで Application.Run() を呼び出して Windows フォームの同期機構を配置する必要があります。この場合の問題は、メイン フォームが表示されることです。このコードをクラスに貼り付けて修正します。
protected override void SetVisibleCore(bool value) {
if (!this.IsHandleCreated) {
this.CreateHandle();
value = false;
}
base.SetVisibleCore(value);
}
これを行う場合、フォームの外観に制限はありません。
于 2010-02-17T21:22:41.957 に答える
2
フォームを渡す必要はまったくありませんApplication.Run
。そうすれば、フォームの可視性をいじる必要がなくなります。これを行うだけです:
var InvokerForm = new Form();
var dummy = InvokerForm.Handle; // force handle creation
Application.Run();
1 つだけ問題があります。フォーム ハンドルの作成は、一度アクセスして強制する必要があります。
于 2012-03-20T10:46:54.550 に答える
1
これを行う最も簡単な方法は、非表示のフォームを作成して に渡すことApplication.Run
です。
SynchronizingObject
その後、プロパティを非表示のフォームに設定できます。
非表示のフォームであることを確認するには、ControlBox
およびShowInTaskbar
プロパティを false に設定します。
于 2010-02-17T21:08:14.383 に答える