2015-02-27 2 views
-3

Спокойной ночи, я пытаюсь вызвать поток пользовательского интерфейса, обновить proprety actualy, внутри метода HttpWebRequest.BeginGetResponse, используя метод CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync. Но это не работает, я не знаю, как это работает на самом деле. Существует мой код:Вызов пользовательского интерфейса в HttpWebRequest.BeginGetResponse

private void DebutReponse(IAsyncResult resultatAsynchrone) 
    { 
     HttpWebRequest requete = (HttpWebRequest)resultatAsynchrone.AsyncState; 
     Stream postStream = requete.EndGetRequestStream(resultatAsynchrone); 

     string donneesAEnvoyer = "username=" + Name + "&password=" + Password + "&email=" + Email; 

     string lol = donneesAEnvoyer; 
     byte[] tableau = Encoding.UTF8.GetBytes(donneesAEnvoyer); 
     postStream.Write(tableau, 0, donneesAEnvoyer.Length); 
     postStream.Close(); 
     requete.BeginGetResponse(FinReponse, requete); 
    } 

    private void FinReponse(IAsyncResult resultatAsynchrone) 
    { 
     HttpWebResponse aResp = null; 
     try 
     { 
      HttpWebRequest requete = (HttpWebRequest)resultatAsynchrone.AsyncState; 
      WebResponse webResponse = requete.EndGetResponse(resultatAsynchrone); 
      Stream stream = webResponse.GetResponseStream(); 

      StreamReader streamReader = new StreamReader(stream); 
      string reponse = streamReader.ReadToEnd(); 
      stream.Close(); 
      streamReader.Close(); 
      webResponse.Close(); 

      //ErrorGridHeight = new GridLength(0.3, GridUnitType.Star); 
      ErrorMsg = msgSucceed; 
     } 
     catch (WebException e) 
     { 
      if (e.Response != null) 
      { 
       aResp = e.Response as HttpWebResponse; 
      } 
     } 
     if (aResp != null) 
      await errorFunc(); 
    } 

    private async Task errorFunc() 
    { 
     await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => ErrorMsg = msgFailed); 
    } 

У меня есть ошибка говорит мне, что я могу использовать только оператор await внутри async метода, который возвращать Task. Я понятия не имею, как это работает.

EDIT: Ok поэтому я изменил мой код немного, чтобы избежать проблем этой функции:

requete.BeginGetResponse(FinReponse, requete); 

, потому что она хочет функция с конкретным прототипом, так что я сделал это:

private async Task lol(IAsyncResult resultatAsynchrone) 
    { 
     HttpWebResponse aResp = null; 
     try 
     { 
      HttpWebRequest requete = (HttpWebRequest)resultatAsynchrone.AsyncState; 
      WebResponse webResponse = requete.EndGetResponse(resultatAsynchrone); 
      Stream stream = webResponse.GetResponseStream(); 

      StreamReader streamReader = new StreamReader(stream); 
      string reponse = streamReader.ReadToEnd(); 
      stream.Close(); 
      streamReader.Close(); 
      webResponse.Close(); 

      //ErrorGridHeight = new GridLength(0.3, GridUnitType.Star); 
      ErrorMsg = msgSucceed; 
     } 
     catch (WebException e) 
     { 
      if (e.Response != null) 
      { 
       aResp = e.Response as HttpWebResponse; 
      } 
     } 
     if (aResp != null) 
      await errorFunc();   
    } 

    private void FinReponse(IAsyncResult resultatAsynchrone) 
    { 
     Task.Run(() => lol(resultatAsynchrone)); 
    } 

    private async Task errorFunc() 
    { 
     await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => ErrorMsg = msgFailed); 
    } 

Единственная проблема заключается в том, что он не меняет proprety, он не входит в набор моего припрета. И у меня есть Exeption, который:

System.NotImplementedExeption

Спасибо за помощь.

+0

«Я не знаю, как это работает». Возможно, это плохая идея задать вопрос здесь. Лучше сначала попытайтесь понять async/await, прочитав онлайн-документацию, учебные пособия и т. Д. – Clemens

+0

Да, я просто смотрел его, https://msdn.microsoft.com/fr-fr/library/hh191443.aspx, но я не уверен полностью понять весь шаг в примере. Я хотел попрактиковаться, чтобы, возможно, лучше справиться. – king

ответ

0

Попробуйте изменить ваш errorFunc() на это.

private void errorFunc() 
{ 
    CoreApplication.MainView.CoreWindow.Dispatcher.BeginInvoke(() => 
    { 
     ErrorMsg = msgFailed; 
    }); 
} 

Я также нашел другое место, где вы пытаетесь изменить ErrorMsg witouth вызова потока пользовательского интерфейса. Это строка с кодом ErrorMsg = msgSucceed;. Я предлагаю использовать один и тот же путь, поэтому заменить строку с этим:

CoreApplication.MainView.CoreWindow.Dispatcher.BeginInvoke(() => 
{ 
    ErrorMsg = msgSucceed; 
}); 
+0

Прежде чем использовать этот метод, но теперь я сменю проект, я не уверен, что это такое, например, приложение Silverlight, и у меня больше нет этого метода PERFECT BeginInvock. Благодарю. – king

0

Вы должны сделать FinReponse метод async, чтобы иметь возможность использовать await оператора в него:

private async void FinReponse(IAsyncResult resultatAsynchrone)

+0

Да, я пробовал, но я думаю, что не могу его изменить, потому что этот метод: 'requete.BeginGetResponse (FinReponse, requete);' нужен, подумайте, конкретный прототип, и он не подходит. – king

0

Я нашел ответ на доступ к пользовательскому интерфейсу, я должен использовать:

  Deployment.Current.Dispatcher.BeginInvoke(()=>mym()); 

и он отлично работает. Спасибо за все.

Смежные вопросы