2009-02-06 135 views
3

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

有没有一种方法可以让第一个javascript函数睡眠,直到发生什么事情(不锁定浏览器)?

编辑:我已经在使用回调函数 - 第2个函数实际上被称为“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; 
} 

回答

4

有没有一种办法可以让第一 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(); 
    }); 
} 
+0

你能否详细说明一下如何将C#回调传递给JS? – 2009-02-06 02:46:18

+0

好 - 快速例子 – Shog9 2009-02-06 03:23:16

+0

甜,这看起来像它会工作。希望WPF不会搞砸了。再次感谢。 – 2009-02-06 03:30:13

0

如果我读正确的问题,你正在寻找一个回调...所以...例如

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); 

} 
0

你可能想你的应用程序作为一个桌面应用程序。你的C#程序没有连接任何与之同步的东西。相位切换到网络模式的时间。

最接近你可以来的是有回调调用ajax与主机的另一个交换。

0

有没有办法让第一个javascript函数能够在睡眠中发生,直到发生什么事情(不锁定浏览器)?

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

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

我想你需要让JavaScript发送result到带有Ajax的服务器(从some-async-function-complete)。然后,分解您的C#以使其中一部分调用myscript,另一部分响应并处理result

2

请参阅相关的问题:Can you wait for javascript callback?

my answer从报价引用到这个问题:

JavaScript Strands增加协同程序和 合作线程支持的 JavaScript语言,使阻塞 能力的异步事件 回调。

多:

Narrative JavaScript是一个小 扩展JavaScript语言 ,使对 异步事件回调拦截功能。这 使异步代码更清晰 易读和易于理解。

尽管在正常情况下异步代码的行为同步在技术上是可行的,但我建议您重新考虑您的设计以采用异步方法。