Двойная задержка загрузки прокси-сервера Javascript/ Silverlight

StackOverflow https://stackoverflow.com/questions/792668

Вопрос

Я создаю приложение Silverlight, которое будет в значительной степени настроено на javascripted.

Чтобы включить взаимодействие с JS, я создал следующий класс SL:

[ScriptableType]
public class JavaScriptProxy
{
    private string _version;

    // provided for testing SL-JS integration
    [ScriptableMember]
    public void SmokeTest() { HtmlPage.Window.Alert("Hello world!"); }
}

И загрузил его в конструктор основного приложения SL:

public App()
{
    this.Startup += this.onStartup;
    this.Exit += this.Application_Exit;
    this.UnhandledException += this.Application_UnhandledException;

    InitializeComponent();

    // register javascript bridge proxy
    // (must register in constructor so proxy is available immediatly)
    HtmlPage.RegisterScriptableObject("JsProxy", new JavaScriptProxy());
}

Однако, поскольку это приложение использует Javascript, его необходимо загружать через сам javascript.

То есть.что-то одинокое:

// called on body.onLoad
function init() {

    var proxy;

    var el = document.getElementById("target_canvas");

    Silverlight.createObject(..., el, "agApp" ..., {

        onLoad: function() {
            proxy = agApp.Content.JsProxy;

            // ***this line is ok***
            proxy.SmokeTest();
        }

    });        

    // ***this line fails (of course)***
    proxy.SmokeTest();

}

Однако это вызывает ошибку, потому что agApp.Content.JsProxy недоступно полностью до тех пор, пока не будет запущено событие Silverlight onLoad, таким образом, поле JsProxy недоступно.

Как я могу включить доступ к классу JsProxy немедленно как я создаю экземпляр Silverlight?Какая-то вещь остается в одиночестве, пока (_mutex);вероятно, это плохая идея.

Мне пришлось это сделать, потому что при создании экземпляров приложения Silverlight будет создан еще один уровень абстракции, так что эта функция должна синхронно загружать все содержимое SL за один раз.

Это было полезно?

Решение

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

Вы можете получить доступ к прокси-серверу JS только после того, как Silverlight создал его экземпляр, поэтому вы можете либо дождаться запуска события OnLoad (но это произойдет только после полной загрузки всего Silverlight.xap), либо после того, как вы RegisterScriptableObject запустите метод JavaScript с именем onYourJSProxyNameLoaded(), который вернет вас к желаемому рабочему процессу.

ХТХ.

- Скотт Барнс / Менеджер по продуктам Rich Platforms / Microsoft.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top