window.external是同步的还是异步的?

3
我刚刚发现了window.external对象,它允许在托管IE类似的浏览器的winform程序中调用C#函数。
我阅读了MSDN上的文档和一些StackOverflow上的线程,但我没有找到这些调用是同步的还是异步的,而且它是否可定制?
在MSDN文档中唯一发现的东西并没有涉及到这个问题 =/

你为什么需要知道? - i_am_jorf
我进行了一些测试,看起来这些调用是异步的。我想确认一下。 - TCHdvlp
1个回答

3

这些调用本质上是同步的,但通常最好异步处理它们,以避免可能会重新进入 JavaScript 代码。您可以使用 SynchronizationContext.Post 来实现。

例如,您从 JavaScript 调用 window.external.TestMethod()。在 .NET 方面,它可能看起来像这样:

this.webBrowser.ObjectForScripting = new ObjectForScripting(this.webBrowser);

// ...

[ComVisible(true), ClassInterface(ClassInterfaceType.None)]
public class ObjectForScripting
{
    WebBrowser _browser;
    SynchronizationContext _context = SynchronizationContext.Current;

    public ObjectForScripting(WebBrowser browser)
    {
        _browser = browser;
    }

    public void TestMethod()
    {
        _context.Post(_ =>
        {
            _browser.Document.InvokeScript("alert", new object[] { 
                "Process a call from JavaScript asynchronosuly." });
        }, null);
    }
}

一种不同的方式,但仍然具有相同的概念是传递一个JS函数,该函数将被异步调用。不过我还没有检查这是否可行。 - Christian
1
实际上,这似乎是可能的,再次感谢@Noseratio:https://dev59.com/questions/D2Ei5IYBdhLWcg3wltIl#21150022 - Christian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接