5

我有一个用 C# 编写的 Windows 窗体应用程序,其中我使用 FileSystemWatcher 来监视文件夹中的新文件,然后对它们执行一些处理。我的应用程序设计为在系统托盘中运行,因此在启动时不会实例化任何表单。问题是 Created 事件在单独的线程上触发,当我尝试在 Created 事件中创建表单的实例时,我得到一个 ThreadStateException,指出我需要在 SingleThreadApartment 中运行。我想我需要设置 FileSystemWatcher.SynchronizingObject 属性,但不知道要使用什么,因为我的应用程序中没有主窗体。

4

3 回答 3

6

您必须在 Main() 方法中调用 Application.Run() 以获取 Windows 窗体同步机制,以便 FileSystemWatcher 可以正确编组对主线程的调用。然后您将遇到的问题是主窗体将变得可见。通过将此代码粘贴到类中来解决此问题:

    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();

那里只有一个问题 - 需要通过访问一次来强制创建表单句柄。

于 2012-03-20T10:46:54.550 回答
1

最简单的方法是制作一个隐藏表单并将其传递给Application.Run.

然后,您可以将该SynchronizingObject属性设置为隐藏表单。

要确保它是隐藏表单,请将ControlBoxandShowInTaskbar属性设置为 false。

于 2010-02-17T21:08:14.383 回答