2008-09-08 20 views
9

Tengo un servicio WCF que incluye componentes UI, lo que me obliga a estar en modo STA.Cómo hacer un servicio WCF STA (un único hilo)

¿Cómo configuro el comportamiento del servicio en el modo STA?


El servicio utiliza una referencia a un archivo DLL de WPF que se abre una ventana de interfaz de usuario (utilizado como puerto de vista) para el análisis de la imagen. Cuando el servicio está tratando de crear una instancia de ese artículo (hereda de ventana) se genera una excepción:

El subproceso de llamada debe ser un STA

Respuesta

0

Me gustaría investigar el uso del atributo [STAThread] para cambiar el modelo de enhebrado p.

[STAThread] 
static void Main() 
{ 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] { new Host() }; 
     ServiceBase.Run(ServicesToRun); 
} 

Description of the STAThread attribute

Pero estoy confundido por qué estás usando componentes de IU en un servicio web en absoluto. ¿Puedes explicar un poco más por qué estás tratando de hacer esto?

+1

Sé que el comentario llega un poco tarde, pero no obstante, ¡no use este enfoque! Básicamente, esto provocará un interbloqueo con el hilo del Finalizador, por lo que la finalización no funcionará y los recursos se perderán. Agregaré la url con más detalles pronto. – Mihailo

+0

http://stackoverflow.com/questions/2001667/net-windows-service-needs-to-use-stathread – GregC

1

Estoy haciendo algo similar a usted.

Mi solución fue enrutar todas las llamadas a través de una cola de hilos STA. Usé una colección de hilos del nuevo parallel framework para poner en cola Acciones que quería ejecutar en un hilo STA. Luego tuve un número X de subprocesos STA que continuamente verificaban la cola para la ejecución de nuevas acciones.

+1

Y, ahora, solo estoy usando un [SynchronizationContext] personalizado (http://msdn.microsoft. com/es-us/magazine/cc163321.aspx # S4) para esto ahora. Una solución mucho mejor. – Will

0

ServiceBehaviour atributo le permite especificar el comportamiento. En su caso para un solo hilo que usaría siguiente:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerCall)] 
public class Service : IService 
{ 
} 

You might want to read about differentInstanceContextMode s para ayudarle a elegir mejor de cómo desea servicio de comportarse.

También es necesario añadir a su nuevo comportamiento en servicio app.config (o editar uno ya existente):

<behavior name="wsSingleThreadServiceBehavior"> 
     <serviceThrottling maxConcurrentCalls="1"/> 
    </behavior> 

y en la configuración de su comportamiento en la misma behaviorConfiguration app.config conjunto como el siguiente:

<service behaviorConfiguration="wsSingleThreadServiceBehavior" name="IService"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsEndpointBinding" name="ConveyancingEndpoint" contract="IService" /> 
    </service> 

Esperanza esto le ahorra algo de tiempo

Cuestiones relacionadas