如何使用Monitor类使异步行为看起来是同步的?

时间:2012-02-03 03:52:02

标签: .net multithreading silverlight windows-phone-7

我正在编写一个将一些javascript加载到WebBrowser对象中的应用程序。为了防止它被加载以及与之相关的延迟,我在我的应用程序加载并保持静态引用时在主UI线程上初始化它。

当我有其他想要使用它的线程时,问题就来了。因此,我试图使用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异常。

谢谢!

1 个答案:

答案 0 :(得分: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;

}

确保这是正确的:)