2011-06-07 13 views
5

Supongamos que tengo aplicación Silverlight haciendo una llamada a un servicio WCF:¿Qué hilo llama al controlador de eventos completo en las llamadas WCF de Silverlight?

void DoStuff() 
{ 
    MyProxy proxy = new MyProxy(); 
    proxy.DoStuffCompleted += DoStuffCompleted; 
    proxy.DoStuffAsync(); 
} 

void DoStuffCompleted(object sender, DoStuffCompletedEventArgs e) 
{ 
    // Handle the result. 
} 

DoStuff es llamado por el hilo de interfaz de usuario. ¿Qué hilo eventualmente llamará al método DoStuffCompleted? Si invoco dos llamadas asíncronas al mismo tiempo, ¿existe la posibilidad de que ambos eventos completos se activen simultáneamente, en diferentes hilos?

+0

Se agregaron etiquetas C# y .NET para aumentar la visibilidad. –

Respuesta

3

La devolución de llamada se invoca en el hilo principal. Múltiples respuestas no ocurrirán simultáneamente. El orden de los eventos de respuesta podría ser inesperado. Es posible que desee utilizar la sobrecarga de proxy.DoStuffAsync que acepte objeto "Estado de usuario":

proxy.DoStuffAsync(object userState)

Esto le permitirá enviar algo único para cada llamada para que pueda diferenciar la cual la respuesta que está tratando con . Recuerde que si la llamada WCF devuelve un error, no tiene valor de retorno, por lo que userState puede ser la única forma de saber qué llamada falló (si es que importa).

Actualización:

encontrado algo más de información (en SO) sobre cómo hacer que use otro hilo:

Silverlight web service callback performance Siga el enlace que hay en el blog Tomek 's para obtener mucha más información.

+0

Gracias, esto está en línea con lo que descubrí usando el depurador. ¿Sabes si esto está claramente documentado en alguna parte? –

1

El evento Completado se producirá en un subproceso diferente al subproceso UI. Se pueden ejecutar múltiples eventos completados simultáneamente en diferentes subprocesos porque se usa un grupo de subprocesos para manejar los resultados.

+0

En mi humilde opinión, esto no es importante con WPF (y Silverlight). Debido a que los elementos de la interfaz de usuario 'Dispatcher' siempre parecerán ser llamados desde el hilo correcto. Lo siento, no puedo proporcionar información más detallada, tal vez hay algo útil aquí: http://msdn.microsoft.com/en-us/library/ms741870.aspx –

+0

@Vladislav: No estoy seguro de lo que quiere decir por "siempre parece ser llamado desde el hilo correcto". No hay magia aquí, si intentas manipular un elemento UI de un hilo __other__ que el hilo UI obtendrás una excepción. Por eso es importante saber si estás en el hilo de UI o no. Por lo general, al completar un WCF usted desea actualizar la UI, es importante cambiar al subproceso de interfaz de usuario antes de hacerlo a través del Dispatcher. – AnthonyWJones

+1

@AnthonyWJones: Hice algunas pruebas rápidas y di un paso por el código de referencia.cs y se invoca el código de "fontanería" interno en un subproceso de trabajo, pero el evento completo se activa en el subproceso Principal. ¿Sabe si esto es algo en lo que se puede confiar, de modo que se puede omitir la sincronización en los componentes de la IU de llamada? –

0

Las llamadas de Asynch se ejecutan en el background thread pool. Para cada llamada asincrónica tendrá un hilo separado del grupo.

DoStuffCompleted se ejecutará en el hilo del grupo de fondo.

Ahora bien, es importante tener en cuenta que este método se llama en el subproceso de trabajo fondo. Si queremos actualizar la interfaz de usuario con los datos recién obtenidos (digamos que queremos actualizar una cuadrícula de datos control para mostrar los datos del cliente), tenemos que tener cuidado de hacer esto en el hilo de la interfaz de usuario. Si no lo hacemos, entonces todo tipo de cosas extrañas puede suceder y vamos a tener un tiempo difícil diagnóstico de errores, que solucionarlo (from here)

Cuestiones relacionadas