5

FileSystemWatcher を使用して新しいファイルのフォルダーを監視し、それらに対して何らかの処理を実行する、C# で記述された Windows フォーム アプリケーションがあります。私のアプリケーションはシステム トレイで実行するように設計されているため、起動時にフォームをインスタンス化しません。問題は、Created イベントが別のスレッドで発生し、Created イベントでフォームのインスタンスを作成しようとすると、SingleThreadApartment で実行する必要があることを示す ThreadStateException が発生することです。FileSystemWatcher.SynchronizingObject プロパティを設定する必要があると思いますが、アプリケーションにメイン フォームがないため、何を使用すればよいかわかりません。

4

3 に答える 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 に答える