没有表单的FileSystemWatcher.SynchronizingObject

时间:2010-02-17 21:05:04

标签: c# filesystemwatcher

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

3 个答案:

答案 0 :(得分:5)

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

    protected override void SetVisibleCore(bool value) {
        if (!this.IsHandleCreated) {
            this.CreateHandle();
            value = false;
        }
        base.SetVisibleCore(value);
    }

如果您执行此操作,表单的外观没有任何限制。

答案 1 :(得分:2)

您根本不需要将任何表单传递给Application.Run。然后你可以节省不得不搞乱表单可见性。就这样做:

var InvokerForm = new Form();
var dummy = InvokerForm.Handle; // force handle creation
Application.Run();

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

答案 2 :(得分:1)

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

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

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