在JavaScript中使异步事件同步

我正在使用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; } 

有没有办法让第一个javascript函数睡眠,直到出现问题(没有锁定浏览器)?

是的 – 您可以使用异步函数,因为它打算使用它:传递一个回调函数,并让它做它的事情。 您应该能够将来自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(); }); } 

看到相关问题: 你能等待javascript回调吗?

引用我对这个问题的回答引用:

JavaScript Strands为JavaScript语言添加了协程和协作线程支持,以支持异步事件回调的阻塞function。

和更多:

叙事JavaScript是JavaScript语言的一个小扩展,它支持异步事件回调的阻塞function。 这使得异步代码清晰可读且易于理解。

虽然在技术上可以使通常异步代码表现为同步,但我建议您重新考虑您的设计以采用异步方法。

如果我正确地阅读了这个问题,那么你正在寻找一个回调…例如……

 function myscript() { some-async-function( params, //any params you plan to use function(result) { //handle the result here }); } function some-async-function(retval,callback) { //assuming this really is an async function such //as an ajax call, etc... ... //work done, use the call back callback(retval); } 

您可能会将您的应用视为桌面应用。 您的C#程序未连接到要同步的任何内容。 相移到网络模式的时间。

你可以来的最近的是javascript回调调用ajax,用于与主机的另一次交换。

有没有办法让第一个javascript函数睡眠,直到出现问题(没有锁定浏览器)?

在你期望它工作的方式,没有。

需要AFAIK,线程控制或连续循环 – 第一个在JavaScript中不可用,后者将锁定大多数浏览器。

我认为你需要使用Ajax将JavaScript result发送到服务器(来自some-async-function-complete )。 然后,分解你的C#,让一部分调用myscript ,另一部分响应并处理result