Tengo una aplicación de formulario de Windows escrita en C# en la que utilizo un FileSystemWatcher para supervisar una carpeta de archivos nuevos y luego realizar algún procesamiento en ellos. Mi aplicación está diseñada para ejecutarse en la bandeja del sistema y, por lo tanto, no crea ninguna instancia en el inicio. El problema es que el evento Creado está activando un hilo separado y cuando intento crear una instancia de un formulario en el evento Creado obtengo una excepción ThreadStateException que indica que debo estar ejecutándome en SingleThreadApartment. Creo que necesito establecer la propiedad FileSystemWatcher.SynchronizingObject pero no sé qué usar ya que no hay un formulario principal en mi aplicación.FileSystemWatcher.SynchronizingObject sin formulario
Respuesta
Tendrá que llamar a Application.Run() en su método Main() para obtener la maquinaria de sincronización de Windows Forms en su lugar para que FileSystemWatcher pueda coordinar correctamente la llamada al hilo principal. El problema que tendrá entonces es que la forma principal se hará visible. Corrija eso pegando este código en la clase:
protected override void SetVisibleCore(bool value) {
if (!this.IsHandleCreated) {
this.CreateHandle();
value = false;
}
base.SetVisibleCore(value);
}
No hay restricciones sobre cómo se ve su formulario si lo hace.
La forma más simple de hacer esto es hacer una forma oculta y pasarla a Application.Run
.
Puede establecer la propiedad SynchronizingObject
en el formulario oculto.
Para asegurarse de que es un formulario oculto, establezca las propiedades ControlBox
y ShowInTaskbar
en false.
En realidad, dado que 'ISynchronizeInvoke' es implementado por' Control', me imagino que sería suficiente crear una instancia 'Control' y asignarla a' SynchronizingObject'. No lo intenté, pero podría funcionar. –
@ FredrikMörk Improbable; algo necesita hacer un ciclo en el hilo principal que realmente realizará la invocación solicitada. Application.Run hace eso. –
No necesita pasar ningún formulario al Application.Run
en absoluto. Entonces puede ahorrar tener que perder el tiempo con la visibilidad del formulario. Sólo hacer esto:
var InvokerForm = new Form();
var dummy = InvokerForm.Handle; // force handle creation
Application.Run();
Sólo una gotcha de allí - la creación de formularios mango debe ser forzado por acceder a él de una vez.
- 1. Control ActiveX sin formulario
- 2. Enviar formulario sin Javascript
- 3. Cargue un formulario sin mostrarlo
- 4. Enviando datos POST sin formulario
- 5. defecto formulario HTML foco sin JavaScript
- 6. Formulario de validación sin Doctrine Entity
- 7. Abrir un formulario en C# sin foco
- 8. cómo serializar un formulario sin jQuery?
- 9. Desinfección formulario de contacto y sin mysql_real_escape_string
- 10. Cerrar formulario sin solicitud de salida
- 11. Python Mechanize seleccione un formulario sin nombre
- 12. Django: ¿Reutilizar campos de formulario sin heredar?
- 13. Mover formulario sin estilo de borde
- 14. ¿Cómo presento un formulario sin ID de formulario y sin ID de envío, pero con un valor oculto conocido?
- 15. sin salto de línea entre el botón y el formulario
- 16. Cómo puedo formatear un formulario HTML sin usar tablas
- 17. Configuración de la variable POST sin usar el formulario
- 18. Pasando el parámetro a la página php sin formulario
- 19. Pepino, capibara y selenio: enviar un formulario sin un botón
- 20. Envíe un formulario usando jquery sin navegar a otra pantalla
- 21. Hacer una solicitud POST en Selenio sin completar un formulario?
- 22. ¿Cómo hacer una aplicación sin formulario en C#?
- 23. Formulario de contacto por correo electrónico sin PHP
- 24. ¿Enviar datos POST a PHP sin usar un formulario HTML?
- 25. Formulario sin token CSRF: ¿cuáles son los riesgos
- 26. form_for sin ActiveRecord, la acción de formulario no se actualiza
- 27. POST una matriz desde un formulario HTML sin javascript
- 28. html5 tipo de entrada requerido sin un formulario. ¿Funciona?
- 29. Validación de entidades sin formulario en Symfony 2
- 30. complemento de formulario jquery, sin manejo de errores
Funcionó como un amuleto. La forma oculta ni siquiera parpadea en la pantalla. – AdmSteck