gpt4 book ai didi

c# - 在 JavaScript 中使异步事件同步

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:56:12 27 4
gpt4 key购买 nike

我正在使用 WPF 3.5SP1 WebBrowser 控件来显示包含一些 javascript 函数的页面。然后,我的程序需要调用一个将进行异步调用的 javascript 函数。我需要一种方法将该异步调用的结果返回给 C#,以便我可以处理结果。

有没有办法让第一个 javascript 函数休眠直到发生某些事情(不锁定浏览器)?

编辑:我已经在使用回调 - 第二个函数实际上称为“some-async-function-complete”。它在异步事件完成时被调用。现在我需要一种将结果导入 C# 的方法。

进一步说明:C#

var result = WebBrowser.InvokeScript("myscript")

JavaScript

var result;

function myscript()
{
some-async-function();
/* what goes here? */
/* wait until result != null */
return result;
}

function some-async-function-complete(retval)
{
result = retval;
}

最佳答案

Is there a way I can make the first javascript function sleep until something happens (with out locking up the browser)?

是的——您可以按照预期的方式使用异步函数:将回调传递给它,然后让它执行它的操作。您应该能够将回调从 C# 传递到您的 JS 函数,然后它可以直接将它传递给您的异步函数,或者如果需要后处理,则将其包装在另一个函数中。


一个回调实现的例子 - 这适用于 WinForms WebBrowser 控件,我没有用 WPF 测试过它,但它们应该几乎相同:

[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class Callback
{
// allows an instance of Callback to look like a function to the script
// (allows callback() rather than forcing the script to do callback.callMe)
[System.Runtime.InteropServices.DispId(0)]
public void callMe(string url)
{
// whatever you want to happen once the async process is complete
}
}

...

Callback cb = new Callback();
WebBrowser.InvokeScript("myscript", new object[] { cb })

...

function myscript(callback)
{
some_async_function(function()
{
// script-specific completion code
if ( callback )
callback();
});
}

关于c# - 在 JavaScript 中使异步事件同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/518880/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com