Su pregunta es un poco incierto (en caso de que sea count <=
?), Pero aquí va ...
Lo que estamos pidiendo es cómo hacer una llamada sincrónica. Con una llamada asíncrona, antes de realizar la llamada, asigna un controlador de eventos al que se llamará cuando finalice la llamada, luego realiza la llamada. Esto significa que su código de finalización tiene una función diferente al código que realiza la llamada. Esto significa que si su llamada asincrónica se realiza en la secuencia de la interfaz de usuario, la interfaz de usuario no se bloqueará mientras se realiza la llamada.
Las llamadas de sincronización son posibles en Silverlight, pero debe asegurarse de no hacerlas en el hilo de la interfaz de usuario. Una forma de lograr esto es iniciar un nuevo hilo de fondo, ejecutar la llamada asincrónica en el hilo de fondo, pero bloquear el retorno hasta que se complete la llamada. Aquí está un ejemplo de código de pseudo:
private AutoResetEvent myResetEvent;
private void MyCallFunction(object someParameter) {
if (this.Dispatcher.CheckAccess())
{
Action<object> a = new Action<object>(MyCallFunction);
a.BeginInvoke(someParameter, null, null);
return;
}
myResetEvent = new AutoresetEvent();
myAsyncCall.CallCompleted += new EventHandler<>(myAsyncCall_CallCompleted);
myAsyncCall.DoAsyncCall(someParameter);
myResetEvent.WaitOne();
//increment your count here
}
private void myAsyncCall_CallCompleted(object sender, SomeEventArgs e) {
if (e.Error == null && !e.Cancelled) {
if (myResetEvent != null)
myResetEvent.Set();
}
}
Tenga en cuenta que este código no es especialmente hilo de seguridad o producción listo - es sólo una muestra rápida.
Lo que sucede aquí es que cuando ingresa MyCallFunction
, comprueba si se está ejecutando en el hilo de la interfaz de usuario, si es así, vuelve a invocarse en una cadena de fondo. Luego configura un AutoResetEvent y realiza la llamada asincrónica.Luego hace una pausa en el objeto myResetEvent
hasta que se haya establecido (o 'señalizado') desde el controlador de llamada finalizada, en cuyo punto continúa la ejecución del código. Tenga en cuenta que no debe intentar acceder a un control directamente desde un código como este sin antes asegurarse de que está de nuevo en el hilo de la interfaz de usuario.
Cuando comencé a averiguar cómo hacer esto en Silverlight, comencé con this SO post y continué con this link. Pero como Marc gravell dice en esa primera publicación, no lo hagas si puedes evitarlo. La única vez que tuve que hacer esto fue cuando necesité agregar los resultados de varias llamadas WCF dispares en un resultado que se devolvió a la IU (y estas llamadas no se pudieron combinar en un método WCF de estilo fachada).
¿Semáforo en Silverlight? –