Проблема с асинхронным ответом веб-службы - PullRequest
0 голосов
/ 05 ноября 2010

В моем приложении WP7 я вызываю и использую веб-сервис с этими методами:

В моем файле .cs страницы:

    public void Page_Loaded(object sender, RoutedEventArgs e)
    {
        if (NavigationContext.QueryString["val"] == "One")
        {
            listAgences=JSON.callWSAgence("http://...");         

            InitializeComponent();
            DataContext = this;                
        }
    }

В моем классе json у меня есть следующие методы:

    public List<Agence> callWSAgence(string url)
    {

            WebClient webClient = new WebClient();
            Uri uri = new Uri(url);
            webClient.OpenReadAsync(uri);

            webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(OpenReadCompletedTestAgence);                

            return listAgences;
    }

    public void OpenReadCompletedTestAgence(object sender, OpenReadCompletedEventArgs e)
    {            
            StreamReader reader = new System.IO.StreamReader(e.Result);
            jsonResultString = reader.ReadToEnd().ToString();
            addAgencesToList();            
            reader.Close();
    }

    public void addAgencesToList()
    {                         
            jsonResultString = json.Substring(5, json.Length - 6);
            listAgences = JsonConvert.DeserializeObject<List<Agence>>(json);                    
    }

Проблема в том, что метод OpenReadCompletedTest в классе json не вызывается сразу после

  webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(OpenReadCompletedTestAgence);

Таким образом, возвращаемое listAgences пусто.

Но позже OpenReadCompletedTestвызывается, и все работает оштрафовано, но мое представление уже загружено.

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

1 Ответ

0 голосов
/ 05 ноября 2010

Поведение (проблема), с которым вы сталкиваетесь, заключается в том, что веб-запрос выполняется асинхронно .

Если вы хотите, чтобы отдельный объект вызывал веб-сервер, он должен обработатьобратный вызов для обработки ответа или внесения соответствующих изменений.

Также:
- код в вопросе не показывает, как определяется переменная jsonPage_Loaded он выглядит как пользовательский класс, но в OpenReadCompletedTestAgence и addAgencesToList он выглядит как строка.
- код в Page_Loaded дважды устанавливает значение listAgences.

проверьте следующий вопрос для получения дополнительной информации о синхронных вызовах асинхронно Подделка синхронных вызовов в Silverlight WP7

...