Запуск асинхронного JavaScript в автономном веб-браузере - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь получить данные из обещания из javascript, запущенного в элементе управления WebBrowser

    [TestMethod]
    public void RunJS()
    {
        var thread = new Thread(() =>
        {
            var browser = new WebBrowser();

            var objectForScripting = new ObjectForScripting();
            browser.ObjectForScripting = objectForScripting;

            browser.Navigate("about:blank");
            var doc = browser.Document.OpenNew(true);
            doc.Write(@"
            <!doctype html>
            <html>
                <head>
                    <meta http-equiv='X-UA-Compatible' value='IE=Edge'/>
                    <script >
                         <!-- *snip* promise polyfill code pasted in from https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js --> 
                    </script>
                    <script>
                        function getPages() {

                            window.Promise.resolve([
                                        'page 1',
                                        'page 2'
                                    ])

                            .then(function(a) {
                                window.external.send(a);                          
                            });


                        }
                        getPages();
                    </script>
                </head>
                <body>

                </body>
            </html>

        ");

        });
        thread.SetApartmentState(ApartmentState.STA);
        thread.DisableComObjectEagerCleanup(); // i just tried this to see if it made a difference
        thread.Start();
        Thread.Sleep(10000); // add this because I thought sleeping on the main thread might help
        thread.Join();
    }

Конечная цель - вызвать асинхронный API, но здесь я только что добавил простое Обещание, чтобы оно заработало. Проблема в том, что then() никогда не вызывается. Я подозреваю, что это как-то связано с потоками (и setTimeout), но я не знаю, как это решить.

Класс ObjectForScripting просто имеет метод, который собирает данные

[ComVisible(true)] 
public class ObjectForScripting 
{
    public object args;
    public void send(object args)
    {
        this.args = args;
    } 
}

У меня установлена ​​точка останова в методе send, но она никогда не вызывается.

Если я просто использую следующее как javascript

function getPages() {
    window.external.send(a);                                     
}
getPages();

точка останова равна хит

...