2009-02-06 155 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語言 ,使對 異步事件回調攔截功能。這 使異步代碼更清晰 易讀和易於理解。

儘管在正常情況下異步代碼的行爲同步在技術上是可行的,但我建議您重新考慮您的設計以採用異步方法。