c# javascript wpf

c# - Hacer el evento asíncrono sincrónico en JavaScript



wpf (5)

Estoy usando el control WPF 3.5SP1 WebBrowser para mostrar una página que contiene algunas funciones de JavaScript. Mi programa necesita invocar una función javascript que hará una llamada asíncrona. Necesito una forma de recuperar el resultado de esa llamada asincrónica a C # para poder procesar el resultado.

¿Hay alguna manera de hacer que la primera función javascript duerma hasta que algo suceda (sin bloquear el navegador)?

editar: ya estoy usando una devolución de llamada: la segunda función se llama en realidad "alguna-función asíncrona-completa". Se llama cuando finaliza el evento asincrónico. Ahora necesito una forma de obtener el resultado en C #.

Para mayor aclaración: C #

var result = WebBrowser.InvokeScript("myscript")

JavaScript

var result; function myscript() { some-async-function(); /* what goes here? */ /* wait until result != null */ return result; } function some-async-function-complete(retval) { result = retval; }


¿Hay alguna manera de hacer que la primera función javascript duerma hasta que algo suceda (sin bloquear el navegador)?

En la forma en que espera que funcione, no.

Se necesitan AFAIK, control de hilo o bucle continuo: el primero no está disponible en JavaScript y el último bloqueará la mayoría de los navegadores.

Creo que necesitarás tener el result envío de JavaScript al servidor con Ajax (desde some-async-function-complete ). Luego, myscript su C # para que una parte llame a myscript y otra responda y procese el result .


¿Hay alguna manera de hacer que la primera función javascript duerma hasta que algo suceda (sin bloquear el navegador)?

Sí, puede usar la función asíncrona tal como estaba destinada a ser utilizada: pasarle una devolución de llamada y dejar que haga su trabajo. Debería poder pasar una devolución de llamada desde C # a su función JS, que puede pasarla a su función asíncrona directamente o envolverla en otra función si se requiere un procesamiento posterior.

Un ejemplo de la implementación de una devolución de llamada: esto funciona con el control WinForms WebBrowser, no lo he probado con WPF, pero deberían ser más o menos lo mismo:

[System.Runtime.InteropServices.ComVisibleAttribute(true)] public class Callback { // allows an instance of Callback to look like a function to the script // (allows callback() rather than forcing the script to do callback.callMe) [System.Runtime.InteropServices.DispId(0)] public void callMe(string url) { // whatever you want to happen once the async process is complete } }

...

Callback cb = new Callback(); WebBrowser.InvokeScript("myscript", new object[] { cb })

...

function myscript(callback) { some_async_function(function() { // script-specific completion code if ( callback ) callback(); }); }


Posiblemente esté pensando en su aplicación como una aplicación de escritorio. Su programa C # no está conectado a nada con el que sincronizar. Tiempo para un cambio de fase en el modo web.

Lo más cercano que puede venir es tener la llamada de javascript llamada ajax para otro intercambio con el host.


Si estoy leyendo la pregunta correctamente, estás buscando una devolución de llamada ... así que por ejemplo ...

function myscript() { some-async-function( params, //any params you plan to use function(result) { //handle the result here }); } function some-async-function(retval,callback) { //assuming this really is an async function such //as an ajax call, etc... ... //work done, use the call back callback(retval); }


Ver pregunta relacionada: ¿Puedes esperar la devolución de llamada de JavaScript?

Citando una cita en mi respuesta a esa pregunta:

JavaScript Strands agrega coroutine y compatibilidad con threading cooperativo al lenguaje JavaScript para habilitar las capacidades de bloqueo para devoluciones de eventos de eventos asíncronos.

Y más:

Narrativa JavaScript es una pequeña extensión del lenguaje JavaScript que habilita las capacidades de bloqueo para devoluciones de eventos de eventos asíncronos. Esto hace que el código asincrónico sea refrescantemente legible y comprensible.

Aunque hacer que un código normalmente asíncrono se comporte como síncrono es técnicamente posible, recomendaría que reconsidere su diseño para adoptar un enfoque asincrónico.