tutorial example consumir configurar .net wcf web-services multithreading user-interface

.net - example - Cómo hacer un servicio WCF STA(single-threaded)



wcf soap service c# (3)

Estoy haciendo algo similar a ti.

Mi solución fue enrutar todas las llamadas a través de una cola de hilos STA. Utilicé una colección segura para hilos del nuevo marco paralelo 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.

Tengo un servicio WCF que incluye componentes UI, lo que me obliga a estar en modo STA.

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

El servicio utiliza una referencia a un archivo DLL de WPF que abre una ventana de IU (utilizada como puerto de visualización) para el análisis de imágenes. Cuando el servicio intenta crear una instancia de ese elemento (hereda de la ventana) arroja una excepción:

El hilo de llamada debe ser un STA


Investigaría usando el atributo [STAThread] para cambiar el modelo de subprocesamiento. p.ej

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

Descripción del atributo STAThread

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


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

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

Es posible que desee leer acerca de diferentes InstanceContextMode para ayudarlo a elegir mejor cómo desea que se comporte el servicio.

También debe agregar a su app.config . app.config nuevo comportamiento del servicio (o editar el existente):

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

y en su configuración de comportamiento en el mismo app.config configure behaviorConfiguration de la siguiente manera:

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

Espero que esto te ahorre algo de tiempo