Я пытаюсь получить данные из обещания из 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();
точка останова равна хит