2012-02-03 48 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; 

}

确认这是正确的:)