Как я могу вызвать функцию, которая требует возвращаемого значения, которое вызывает WebClient? - PullRequest
0 голосов
/ 23 февраля 2012

Вот функция, которая у меня сейчас есть, которая, очевидно, не работает. Причина, по которой он не работает, заключается в том, что WebClient является асинхронным, а data пусто до того, как заполняется WebClient и приводит к сбою в программе чтения XML. Как я могу вызвать WebClient внутри этой функции и все же позволить ему возвращать ServerResult в соответствии с требованиями с или без необходимости использования внешнего обработчика событий?

static public ServerResult isBarcodeCorrectOnServer(string barcode)
{
            Dictionary<string, IPropertyListItem> dict = configDictionary();

            string urlString = (string.Format("http://www.myurl.com/app/getbarcodetype.php?realbarcode={0}&type={1}", barcode, dict["type"]));

            WebClient wc = new WebClient();
            string data = "";
            wc.DownloadStringCompleted += (sender, e) =>
            {
                if (e.Error == null)
                {
                    //Process the result...
                    data = e.Result;
                }
            };
            wc.DownloadStringAsync(new Uri(urlString));

            StringReader stream = new StringReader(data);
            var reader = XmlReader.Create(stream);
            var document = XDocument.Load(reader);
            var username = document.Descendants("item");
            var theDict = username.Elements().ToDictionary(ev => ev.Name.LocalName, ev => ev.Value);

            if (theDict.ContainsKey("type") == true && theDict["type"].ToString() == dict["type"].ToString())
            {
                return ServerResult.kOnServer;
            }
            else if (theDict.ContainsKey("type") == true)
            {
                return ServerResult.kWrongType;
            }
            else
            {
                return ServerResult.kNotOnServer;
            }
        }

Ответы [ 2 ]

5 голосов
/ 23 февраля 2012

Вы не можете без «хаков» и не должны - принять асинхронность и передать делегата, которого вы хотите выполнить после завершения загрузки:обработка кода теперь в отдельный метод, который вы вызываете с результатом загрузки.

0 голосов
/ 23 февраля 2012

Вы не можете, в основном. Или, по крайней мере, вы не должны. У вас есть метод, который предназначен для синхронного , на платформе, которая предназначена для асинхронного IO.

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

Обратите внимание, что когда выйдет C # 5 и будет поддерживаться Windows Phone, все это будет на много проще, если использовать async. Вы бы вернули Task<ServerResult> из метода и await результат WebClient. Если вы разрабатываете только для удовольствия (поэтому не возражайте против работы с CTP, в котором есть некоторые ошибки, и который может быть недействительным для доставки на рынок приложений), вы можете сделать это сегодня .

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