2017-04-19 2 views
-2

code snippet link Je développe l'application Windows 8 en C#. J'ai 2 textBlocks dans mon interface graphique. Je reçois une entrée de texte de l'utilisateur et l'affecte à textBlock1 en utilisant textBlock1.Text = user input;. Ensuite, j'appelle une méthode qui obtient des données de l'API dans JSON et une partie des données qu'elle contient dans textBlock2 en utilisant textBlock2.Text = "specific data"; mais le texte des deux blocs de texte est modifié en même temps que je ne veux pas. en fonction de la séquence de code, le texte de textBlock1 doit être changé plus tôt car textblock2 le changement de texte se produit après un appel à l'API qui prend environ 10 sec. Comment puis-je d'abord modifier le texte de textBlock1? aidez-moi car je suis nouveau au développement de Windows.Comment rafraîchir textBlock Text après avoir mis à jour son texte?

+0

Cela vous aidera si vous postez un extrait de code. –

+0

@SeanStayn stayn J'ai ajouté un extrait de code. J'espère qu'il efface ce que j'essaie –

+0

Post le code de la méthode 'populateResponses'. – Unknown

Répondre

0

Dans votre méthode, vous utilisez

HttpResponseMessage response = client.GetAsync(userInput).Result; 
string result = response.Content.ReadAsStringAsync().Result; 

Si vous appelez une méthode Async, vous devez utiliser l'instruction d'attendre, si le code doit attendre l'appel de méthode, comme ceci:

HttpResponseMessage response = await client.GetAsync(userInput).ConfigureAwait(false); 
string result = await response.Content.ReadAsStringAsync().ConfigureAwait(false); 

Mais pour cela, vous devez changer votre méthode pour async:

private async void button_Click(object sender, RoutedEventArgs e) 

peut-être, cela résout votre problème. Offshore: Parce que vous êtes nouveau, je recommande de visiter la page this et de les lire, pour mieux comprendre Stack Overflow.

Mise à jour: Je oublié ".ConfigureAwait (false)"

+0

désolé @SeanStayn. ça n'a pas pu résoudre mon problème. –

0

L'appel API verrouille l'interface utilisateur. Si vous voulez mettre à jour textblock1 avant textblock 2 vous devez faire l'appel sur un thread différent. Quelque chose comme ça devrait fonctionner.

//make the method async. 
private async void button_click(object sender, RoutedEventArgs e) 
{ 

//... 

//assuming userMessage is textblock2. 
userMessage.Text = await MakeAPICallAsync(); 


//... 

} 

//where MakeAPICallAsync() is another function defined as 
private async Task<string> MakeAPICallAsync() 
{ 
//API call; 
return result; 
}