Асинхронные действия внутри метода Silverlight - возвращение значения - PullRequest
2 голосов
/ 26 марта 2010

Как правильно вызвать компонент платформы Async - дождитесь ответа и затем верните значение. AKA содержит весь запрос / ответ в одном методе.

Пример кода:

    public class Experiment
    {
     public Experiment()
     {

     }
        public string GetSomeString()
        {
            WebClient wc = new WebClient();
            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
            Uri u = new Uri("http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=t&output=rss");
            wc.DownloadStringAsync(u);
            return "the news RSS from Google";
        }

        private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {

            //don't really see how this callback method makes it able
            // to return the answer I'm looking for on the return
            // statement in the method above.
        }
    }

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ : Причина, по которой я спрашиваю об этом, заключается в том, что у меня есть проект, над которым я хочу, чтобы код JavaScript в браузере использовал Silverlight, например, Facade / Proxy to Web-сервисы, и сложные вычисления и операции. Я хотел бы сделать синхронные вызовы [ScriptableMembers] в Silvelight. Я не хочу, чтобы Silverlight вызывал JavaScript в браузере

Ответы [ 2 ]

1 голос
/ 31 марта 2010

Обычно я передаю эталонный объект из моего первого метода. Затем метод обратного вызова изменяет объект с помощью сохраненной ссылки. Предупреждение заключается в том, что вы находитесь в потоке пользовательского интерфейса, если у объекта есть свойства, отображаемые на экране.

1 голос
/ 28 марта 2010

Хотя блокировка пользовательского интерфейса с синхронными вызовами на веб-сервере, безусловно, не типична для современного веб-приложения, вы должны быть в состоянии сделать то, что вы хотите, осторожно используя ManualResetEvent .

По сути, вы бы заставили GetSomeString в вашем примере кода ждать ( WaitOne , предпочтительно с тайм-аутом), пока происходит загрузка, и при сбое или завершении загрузки строки, вы бы инициировали ( Set ) событие, чтобы затем продолжить метод блокировки в GetSomeString. Вам нужно было бы поместить результат загрузки где-то в общих чертах с вызывающей стороной и убедиться, что он потокобезопасен.

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