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