2012-02-03 44 views
0

我正在寫一個應用程序加載一些JavaScript到WebBrowser對象。爲了防止這種情況發生,以及與之相關的延遲,我在應用程序加載並保留對其的靜態引用時,在主UI線程上初始化它。如何使用Monitor類使異步行爲看起來同源?

問題出在我有其他線程想要使用它。因此,我試圖用Monitor類來幫助我。

在主線程我有

public static readonly WebBrowser webBrowser = new WebBrowser(); 
private static readonly object syncObject = new object(); 

當其他線程調用它,我有以下功能。

public static string GetDataFromJs(string key) 
{ 
    string result = string.Empty; 

    if (isInitialized == true) 
    { 
     try 
     { 
      webBrowser.Dispatcher.BeginInvoke(() => 
       { 
        result = (string)webBrowser.InvokeScript("getData", key); 
        //TODO: pulse monitor object. 
       }); 

      //TODO: wait for monitor object to get pulsed. 
      return result; 
     } 
     catch(Exception ex) 
     { 
      return string.Empty; 
     } 
    } 

    return string.Empty; 
} 

任何人都可以幫我弄清楚我需要從這裏做什麼?我已經嘗試Monitor.Wait/Enter和Monitor.Pulse在他們各自的評論區域,但我不斷收到Syncronization例外。

謝謝!

+0

我覺得自己像一個白癡哈哈......忘了把它所有的鎖內。 – Dave 2012-02-03 04:00:25

回答

0

public static string GetDataFromJs(string key) string result = string.Empty;

if (isInitialized == true) 
{ 
    try 
    { 
     webBrowser.Dispatcher.BeginInvoke(() => 
      { 

       lock(syncObject) 
       { 
        result = (string)webBrowser.InvokeScript("getData", key); 
        Monitor.Pulse(syncObject); 
       } 
      }); 

     lock(syncObject) 
     { 
      Monitor.Wait(syncObject); 
     } 

     return result; 
    } 
    catch(Exception ex) 
    { 
     return string.Empty; 
    } 
} 
return string.Empty; 

}

確認這是正確的:)