2010-10-19 30 views
6

He creado un servicio WCF (.NET 3.5) simple que define 10 contratos que son básicamente cálculos en los datos suministrados. Por el momento, espero que bastantes clientes llamen a algunos de estos contratos. ¿Cómo hago que el servicio sea más receptivo? Tengo la sensación de que el servicio esperará hasta que procese una solicitud para pasar a la siguiente. ¿Cómo puedo usar multihebra en WCF para acelerar las cosas?WCF Service and Threading

+0

Te entiendo bien cuando digo que experimentas respuestas lentas? ¿Cuántas llamadas hace un cliente por ejemplo, digamos? ¿Y qué es lento? –

Respuesta

18

Aunque estoy de acuerdo con Justin's answer, creo que un poco más de luz puede ser derramada aquí sobre cómo funciona WCF.

a tomar la declaración específica:

Tengo la sensación de que el servicio será esperar a que se procese una solicitud a ir a la siguiente. ¿Cómo puedo usar multihilo en WCF para acelerar las cosas ?

La concurrencia de un servicio (cuántas llamadas puede tomar simultáneamente) depende del ConcurrencyMode value for the ServiceBehavior adjunto al servicio. De manera predeterminada, este valor es ConcurrencyMode.Single, lo que significa que serializará las llamadas una tras otra.

Sin embargo, esto podría no ser tan problemático como cree. Si su servicio es InstanceContextMode es igual a InstanceContextMode.PerCall, entonces esto no es un problema; se creará una nueva instancia de su servicio por llamada y no se usará para ninguna otra llamada.

Si tiene un singleton o un objeto de servicio basado en una sesión, sin embargo, las llamadas a esa instancia de la implementación del servicio se serializarán.

Siempre puede cambiar el ConcurrencyMode, pero tenga en cuenta que si lo hace, tendrá que manejar problemas de concurrencia y acceder a sus recursos manualmente, ya que le ha indicado explícitamente a WCF que lo hará.

Es importante no cambiar esto solo porque cree que dará lugar a un mayor rendimiento. Aunque no tanto por concurrencia, el aspecto de instancias de su servicio forma parte de la identidad del servicio (si es una sesión o no basada en la sesión) y su modificación afecta a los clientes que consumen el servicio, por lo que no lo haga a la ligera

Por supuesto, esto no dice nada si el código que implementa es o no eficiente. Eso es definitivamente algo que debe estudiarse cuando indica que es el caso.

3

Esto definitivamente es una optimización pre-madura. Implemente sus servicios primero y vea si hay un problema o no.

Creo que encontrará que no se está preocupando por nada. El servidor no bloqueará en una sola solicitud a medida que esa solicitud procese. IIS/WCF debería manejar las cosas por usted como está.

1

No estoy familiarizado con WCF, pero ¿el proceso puede ser asincrónico? Si está esperando una gran cantidad de datos y cálculos intensivos, una opción podría ser enviar un id, calcular los valores en un subproceso separado y luego proporcionar un método para devolver el resultado utilizando el id inicial.

Algo así como:

int id = Service.CalculateX(...); 
... 
var y = Service.GetResultX(id);