我有一个用 C# 编写的 Windows 窗体应用程序,其中我使用 FileSystemWatcher 来监视文件夹中的新文件,然后对它们执行一些处理。我的应用程序设计为在系统托盘中运行,因此在启动时不会实例化任何表单。问题是 Created 事件在单独的线程上触发,当我尝试在 Created 事件中创建表单的实例时,我得到一个 ThreadStateException,指出我需要在 SingleThreadApartment 中运行。我想我需要设置 FileSystemWatcher.SynchronizingObject 属性,但不知道要使用什么,因为我的应用程序中没有主窗体。
问问题
3562 次
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
属性设置为隐藏表单。
要确保它是隐藏表单,请将ControlBox
andShowInTaskbar
属性设置为 false。
于 2010-02-17T21:08:14.383 回答