Как использовать класс Monitor, чтобы асинхронное поведение выглядело синхронным? - PullRequest
0 голосов
/ 03 февраля 2012

Я пишу приложение, которое загружает некоторый JavaScript в объект WebBrowser. Чтобы предотвратить загрузку и связанную с этим задержку, я инициализирую его в основном потоке пользовательского интерфейса при загрузке приложения и сохраняю статическую ссылку на него.

Проблема возникает, когда у меня есть другие темы, которые хотят его использовать. Таким образом, я пытаюсь использовать класс 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 голосов
/ 03 февраля 2012

открытая статическая строка GetDataFromJs (строковый ключ) {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;

}

Убедитесь, что это правильно:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...