JS в C# Форма WebBrowser Застрял пользовательский интерфейс? - PullRequest
1 голос
/ 20 июня 2020

Запуск кода Javacript в C# Windows Form WebBrowser. Необходимо, чтобы он мог работать долгое время l oop без зависания пользовательского интерфейса формы. Есть идеи как? Или другие способы запустить JS для достижения этого

Код:

[ComVisible(true)]
    public void ExecuteJS(WebBrowser wb)
    {

        // Create the webpage, testing a long loop to check UI stuck or not
        wb.DocumentText = @"<html>
            <head>
                <title>Test</title>
            </head>
            <body>
            <script>
            function TestInvoke() {
            while (true) {
            window.external.AnotherMethod('Hello');
            wait(2500);
            }
            }

            function wait(ms){
            var start = new Date().getTime();
            var end = start;
            while(end < start + ms) {
            end = new Date().getTime();
            }
            }
            </script>
            </body>
            </html>";
    }
}

Вызывается (в потоке, который все еще вызывает зависание пользовательского интерфейса):

 private void BottingThread()
    {
        //run the js script
        this.Invoke(new Action(() => { webBrowser1.Document.InvokeScript("TestInvoke").ToString(); }));
    }

1 Ответ

0 голосов
/ 20 июня 2020
Код

Javascript выполняется в одном потоке, поэтому вы не можете этого сделать. Вместо этого вы можете использовать setInterval, который периодически вызывает такую ​​функцию:

<script>

function TestInvoke() {
    setInterval(function() {
        window.external.AnotherMethod('Hello');
    }, 2500);
}

</script>

Start / Stop logi c:

setInterval можно остановить с помощью clearInterval. setInterval вернет дескриптор / идентификатор, который вам нужно передать в clearInterval, когда вы захотите остановиться. Пример того, как оба могут использоваться для запуска / остановки al oop:

var interval = null;                           // the id of the current loop (initially set to null to indicate that no loop is in progress)

function start() {                             // the function that starts the loop
    if(interval !== null) {                    // first let's check that there aren't any loops already running
        clearInterval(interval);               // if so stop them first
    }

    interval = setInterval(function() {        // then start a loop and store its id in interval
        // code to be looped
    }, 2500);                                  // specify the delay between each iteration
}

function stop() {                              // the function that stops the loop
    if(interval !== null) {                    // if a loop is in progress
        clearInterval(interval);               // ... stop it
        interval = null;                       // and set interval to null to indicate that no loop is running
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...