2010-06-01 6 views
6

Estoy intentando configurar algunas cosas de WCF. Actualmente, tengo un servidor que permite a los usuarios remotos descargar archivos y clientes. En el servidor, utilizo una clase ServiceHost. Supongo que debería ejecutarse en un hilo separado, sin embargo, la IU del servidor (WinForms) se bloquea cuando alguien descarga un archivo. ¿Hay alguna manera de administrar el modelo de subprocesamiento WCF?Enlazado de WCF: interfaz de usuario no receptiva

¡Gracias!

+0

¿Cómo hospedas el servicio? ¿Es un servicio de ventana o un hosting personalizado usando algún exe? – Kangkan

+0

El archivo ejecutable de WinForms alberga la biblioteca de servicios WCF. – SharpAffair

Respuesta

1

"Desde la misma aplicación Windows Form si construyera la instancia ServiceHost antes de iniciar el hilo UI, se ejecutará en su propio hilo. Esto significa que los subprocesos de trabajo asignados desde el grupo de subprocesos procesan mensajes en lugar del bucle de mensaje. Por lo tanto, los servicios pueden procesar realmente múltiples solicitudes concurrentes. "

+1

Esto dará como resultado una funcionalidad equivalente a la respuesta que di a continuación. Dado que está creando ServiceHost antes de que la propiedad SycnhronizationContext.Current se establezca en una instancia de WindowsFormsSynchronizationContext (por ejemplo, antes de que se hayan creado controles), su ServiceHost no intentará procesar las solicitudes de servicio en el hilo de la interfaz de usuario. La ventaja de mi solución es que hace que este comportamiento sea una cuestión de política, por lo que no importa en qué momento decida crear su ServiceHost. – luksan

0

No debe alojar un servicio WCF dentro de un programa de IU. WCF tiene un modelo de subprocesamiento muy específico, que evitará que su UI funcione correctamente.

Básicamente, el esquema de subprocesamiento WCF cambia según el comportamiento de gestión de instancia seleccionado, y también cuando no hay solicitudes que llegan al servicio durante un período de tiempo WCF puede suspender el hilo en ejecución. Todo esto causará problemas con la interfaz de usuario.

Lo que hago en estas situaciones, es crear un Windows Service hosting WCF y crear un ServiceContract para exponer los datos necesarios a la interfaz de usuario de supervisión. Esta interfaz de usuario se ejecutará de forma independiente en su propio administrador, siendo otro cliente del servicio, obteniendo los datos del servicio según sea necesario.

Espero que tenga sentido para usted.

11

Debe agregar un ServiceBehaviorAtttribute a la clase que implementa su servicio y establecer su propiedad UseSynchronizationContext en falso. Esto hará que las llamadas a su servicio se procesen en su propio hilo.

Ejemplo:

[ServiceBehavior(UseSynchronizationContext=false)] 
class YourService : IYourService 
{ 
    // Service Methods 
} 

Sólo recuerde que si se va a actualizar ninguna Controles desde el interior de sus métodos de servicio, se debe tener presente la cross-thread programming model of Windows Forms.

+0

¡wOW + 1 no conocía esa función! –

+0

Esta es la solución para ~ 2 días de búsqueda de errores, por qué un servicio WCF no funciona en una aplicación que no es UI (la aplicación tiene tanto el modo UI como el modo no UI). Gracias. –

Cuestiones relacionadas