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. Enviar formulario sin Javascript
- 2. Control ActiveX sin formulario
- 3. Cargue un formulario sin mostrarlo
- 4. Enviando datos POST sin formulario
- 5. Formulario de validación sin Doctrine Entity
- 6. defecto formulario HTML foco sin JavaScript
- 7. Django: ¿Reutilizar campos de formulario sin heredar?
- 8. Python Mechanize seleccione un formulario sin nombre
- 9. Desinfección formulario de contacto y sin mysql_real_escape_string
- 10. cómo serializar un formulario sin jQuery?
- 11. Mover formulario sin estilo de borde
- 12. Cerrar formulario sin solicitud de salida
- 13. Abrir un formulario en C# sin foco
- 14. ¿Cómo presento un formulario sin ID de formulario y sin ID de envío, pero con un valor oculto conocido?
- 15. Configuración de la variable POST sin usar el formulario
- 16. Formulario sin token CSRF: ¿cuáles son los riesgos
- 17. Cómo puedo formatear un formulario HTML sin usar tablas
- 18. Cómo imprimir el informe de ReportViewer sin mostrar un formulario
- 19. form_for sin ActiveRecord, la acción de formulario no se actualiza
- 20. Validación de entidades sin formulario en Symfony 2
- 21. Hacer una solicitud POST en Selenio sin completar un formulario?
- 22. ¿Cómo hacer una aplicación sin formulario en C#?
- 23. Envíe un formulario usando jquery sin navegar a otra pantalla
- 24. Agregar a innerHTML sin destruir los contenidos del formulario
- 25. Formulario de contacto por correo electrónico sin PHP
- 26. Pasando el parámetro a la página php sin formulario
- 27. sin salto de línea entre el botón y el formulario
- 28. html5 tipo de entrada requerido sin un formulario. ¿Funciona?
- 29. Cómo usar ISynchronizeInvoke sin hacer referencia al Formulario
- 30. Pepino, capibara y selenio: enviar un formulario sin un botón
Funcionó como un amuleto. La forma oculta ni siquiera parpadea en la pantalla. – AdmSteck