2009-02-06 2 views
3

Я использую элемент управления WPF 3.5SP1 WebBrowser для отображения страницы, содержащей некоторые функции javascript. Моя программа тогда должна вызвать функцию javascript, которая сделает асинхронный вызов. Мне нужен способ получить результат этого асинхронного вызова на C#, чтобы я мог обработать результат.Синхронизировать событие async в JavaScript

Есть ли способ, с помощью которого функция javascript может работать до тех пор, пока что-то не произойдет (без блокировки браузера)?

Редактировать: Я уже использую обратный вызов - вторая функция на самом деле называется «some-async-function-complete». Он вызывается, когда событие async завершается. Теперь мне нужен способ получить результат в C#.

Для дальнейшего уточнения: 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; 
} 

ответ

4

Есть ли способ, что я могу сделать первый Javascript функция сна до что-то не происходит (с вне запирание браузер)?

Да - вы можете использовать асинхронную функцию, поскольку она предназначена для использования: передайте ей обратный вызов и позвольте этому сделать свое дело. Вы должны иметь возможность передать обратный вызов из C# в вашу JS-функцию, которая затем может передать ее непосредственно вашей асинхронной функции или перенести ее в другую функцию, если требуется пост-обработка.


Пример реализации обратного вызова - это работает с контролем WinForms WebBrowser, я не проверял его с WPF, но они должны быть в значительной степени то же самое:

[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(); 
    }); 
} 
+0

Можете ли вы рассказать о том, как я могу передать обратный вызов из C# в JS? –

+0

ok - quick'n'dirty пример – Shog9

+0

Сладкий, похоже, он будет работать. Надеюсь, WPF не испортит ситуацию. Еще раз спасибо. –

0

Если я правильно читал этот вопрос, вы ищете обратный вызов ... так, например ...

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); 

} 
+0

Я уже использую обратный вызов - вторая функция на самом деле называется «some-async-function-complete». Он вызывается, когда событие async завершается. Теперь мне нужен способ получить результат в C# –

0

Вы, возможно, думаете о приложении в качестве настольного приложения. Ваша программа C# не связана ни с чем, с которой синхронно. Время сдвига фазы в веб-режим.

Ближайший, к которому вы можете обратиться, - это обратный вызов javascript ajax для другого обмена с хостом.

+0

Моя программа на C# - это настольное приложение: P Я запускаю JavaScript внутри элемента управления WebBrowser WPF. Событие отправляется с помощью WebBrowser.InvokeScript() –

+0

Это усложняется, потому что я не уверен в цели. Но для управления WebBrowser, по-видимому, необходимо, чтобы POST или GET или Ajax-сервер для чего-то продолжал процесс. Он не знает о вашей программе на C#, о которой я не думаю; но я никогда не использовал этот контроль. – dkretz

0

Есть ли способ, с помощью которого функция javascript может выполнять до тех пор, пока что-то не произойдет (без блокировки браузера)?

То, как вы ожидаете его работы, нет.

AFAIK, управление потоком или непрерывное соединение - первое недоступно в JavaScript, и последнее блокирует большинство браузеров.

Я думаю, вам нужно будет отправить JavaScript result на сервер с помощью Ajax (от some-async-function-complete). Затем разбейте свой C#, чтобы получить один вызов по номеру myscript, а другой ответ и процесс result.

2

См родственный вопрос: Can you wait for javascript callback?

Цитирование от цитаты в my answer на этот вопрос:

JavaScript Strands добавляет сопрограмму и кооперативную поддержку многопоточности в JavaScript язык для включения блокировки возможности для асинхронного события обратные вызовы.

И еще:

Narrative JavaScript небольшой расширение языка JavaScript , что позволяет блокировать возможности для асинхронных обратных вызовов событий. Это делает асинхронный код освежающим читабельным и понятным.

Хотя нормальный асинхронный код ведет себя как синхронный, технически возможно, я бы рекомендовал вам пересмотреть свой дизайн, чтобы перейти с асинхронным подходом.

Смежные вопросы