He creado un servicio de Windows que llamará a algunos componentes COM, así que etiqueté [STAThread] a la función principal. Sin embargo, cuando se dispara el temporizador, informa MTA y las llamadas COM fallan. ¿Cómo puedo arreglar esto?.NET El servicio de Windows necesita usar STAThread
using System;
using System.Diagnostics;
using System.ServiceProcess;
using System.Threading;
using System.Timers;
namespace MyMonitorService
{
public class MyMonitor : ServiceBase
{
#region Members
private System.Timers.Timer timer = new System.Timers.Timer();
#endregion
#region Construction
public MyMonitor()
{
this.timer.Interval = 10000; // set for 10 seconds
this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer_Elapsed);
}
#endregion
private void timer_Elapsed (object sender, ElapsedEventArgs e)
{
EventLog.WriteEntry("MyMonitor", String.Format("Thread Model: {0}", Thread.CurrentThread.GetApartmentState().ToString()), EventLogEntryType.Information);
}
#region Service Start/Stop
[STAThread]
public static void Main()
{
ServiceBase.Run(new MyMonitor());
}
protected override void OnStart (string[] args)
{
EventLog.WriteEntry("MyMonitor", "My Monitor Service Started", EventLogEntryType.Information);
this.timer.Enabled = true;
}
protected override void OnStop()
{
EventLog.WriteEntry("MyMonitor", "My Monitor Service Stopped", EventLogEntryType.Information);
this.timer.Enabled = false;
}
#endregion
}
}
+1 para la solución alternativa; sin embargo, ¿cómo se explica que exista el mismo problema para las aplicaciones de consola? Según tengo entendido, tu explicación parece no ser correcta. Un servicio se inicia como un proceso secundario del administrador de control de servicio (y no como un hilo) y luego el servicio se conecta al controlador llamando a 'StartServiceCtrlDispatcher' (por lo que puedo ver en Reflector) para comenzar un servicio como STA. posible. –
No existe para aplicaciones de consola. Las aplicaciones de la consola respetan el STAThreadAttribute. Los servicios no. El SCM no se ejecuta en un hilo STA. El SCM no respeta ni proporciona ningún método para que los servicios comuniquen el estado de su apartamento deseado. El código del OP es confuso, ya que incluye el método Principal. Todo lo que el método Principal hace es decir, "Oye, SCM, aquí hay una DLL que contiene un tipo de servicio que quiero que ejecutes, kthxbai" y se va. Sí, eso se ejecuta en un hilo STA, pero no se bloquea y vuelve de inmediato. El SCM luego determina cuándo ejecutar el servicio utilizando sus propios hilos. – Will
Will, Después de buscar un poco más en la web y su respuesta, tengo una nueva estructura a continuación (no había suficientes caracteres para dejarla como un comentario) –