7
votes

Tâche.Wait retourne toujours faux bien que la tâche finie

J'utilise httpclient code> essayer d'exécuter une méthode postale dans le contrôleur API Web. La méthode du contrôleur est synchrone. Je le fais de cette façon: xxx pré>

après que j'appelle attendre code>: p> xxx pré>

quand Exécution de ce code, je vois l'exécution de la finition HTTP, mais le résultat code> est toujours faux. Que puis-je manquer? P>

Edit: J'ai maintenant essayé une approche asynchratante mais cela ne m'a pas aidé aussi aussi p>

TestServer _owinTestServer;
public async Task<HttpResponse message> Method1(string url, object body)
{
    return await 
   _owinTestServer.HttpClient.PostAsJsonAsync(url,body);
}

public async Task<ItemPreview> Method2(object body);
{
     return await Method1("..", body ).Result.Content.ReadAsAsync<ItemPreview>();
}

[TestMethod]
public void test1()
{
    Item item = new(...);
    Method2(item).Continue with(task => {// Never reach     here }
}


4 commentaires

Quel est le point d'appeler attendre () si vous utilisez ASYNC API? Vous seriez mieux d'utiliser attendre .


Parce qu'il n'ya aucun moyen de poster des données de manière synchrone en utilisant httpclient , sinon je le ferais de manière synchrone. Pour une raison quelconque, j'ai eu une impasse lorsque j'ai essayé d'utiliser le attendre


Tout d'abord, je ne recommanderais pas attendre dans async , toujours utiliser attendre . Deuxièmement, veuillez poster le code complet qui cause une impasse, de cette façon, nous pouvons trier quel est le problème réel au lieu de mélanger le blocage et le code non bloquant.


@ Razort4x j'ai posté mon code


4 Réponses :


0
votes

Peu importe si la méthode du contrôleur est synchrone ou non. C'est purement une préoccupation sur le code du serveur. Depuis la méthode postasjsonasync est asynchrone, vous devez attendre IT: xxx

qui permettra à votre code d'attendre la réponse du serveur.


0 commentaires

9
votes

Vous mélangez des appels asynchronisés et bloquants (c'est-à-dire .result code>, .wait () code>) qui conduit à une impasse.

Cela ressemble plus à ce qu'il s'agisse d'un problème de blocage du côté du client test. p>

Vous devez effectuer le test ASYNC jusqu'à présent dans ce cas si vous souhaitez attendre des résultats du serveur. p>

Convertir la méthode de test en ASYNC P>

public async Task<ItemPreview> Method2(object body) {
    var response = await Method1("..", body );
    return await response.Content.ReadAsAsync<ItemPreview>();
}


0 commentaires

0
votes

Je suppose que votre code initial avait l'air comme celui-ci ... XXX PRE>

et oui, le résultat sera faux après avoir attendu les 15 secondes. En effet, vous avez configuré la demande, alias la réponse, mais vous n'avez pas réellement rendu l'appelé et toute réponse. Await (n) retournera false. P>

Vous avez juste besoin de démarrer le fichier ReadasaSync ... p> xxx pré>

Cependant, je pense que vous trouverez que vous pouvez ignorer la réponse.Wait (n) tous ensemble, car il retournera vrai parce que le ReadasaSync () attendra de retourner ou échouer. Si vous souhaitez configurer le délai de requête, vous pouvez le faire dans le HTTPCLIPT et votre fichier ReadasaSync lancera une exception d'agrégate à une exception Innère de TaskCanceledException. P>

sur une note latérale, vous n'avez pas besoin d'utiliser owin.httpclient Vous pouvez simplement instancier un nouveau httpClient. Je crois que l'objet Owin que vous parlez est d'accueillir votre webapi, je ne sais pas si cela importe. Mais disons que vous appelez ajouter (élément article) sur votre webapi et que db.additem (item) retournera et itemPreview objet, votre code pourrait ressembler à ceci: P>

[TestMethod]
public void test1()
{
    Item item = new(...);
    var uri = "..";
    var client = new HttpClient();
    var response = client.PostAsJsonAsync(uri, item);
    var itemPreview = response.Result.Content.ReadAsAsync<ItemPreview>();

    /*  The things to happen once you have item preview */

}


0 commentaires

0
votes

Le résultat peut toujours être faux car le _db.additem renvoie de faux tout le temps. Sinon, j'ai effectué une modification de votre code idéalement, ce qui devrait fonctionner pour vous

TestServer _owinTestServer;
public async Task<HttpResponse message> Method1(string url, object body)
{
    return await _owinTestServer.HttpClient.PostAsJsonAsync(url,body);
}

public async Task<ItemPreview> Method2(object body);
{
     return await Method1("..", body ).Result.Content.ReadAsAsync<ItemPreview>();
}

[TestMethod]
public void test1()
{
    Item item = new(...);
    await Method2(item).ContinueWith(task => {// Never reach     here }
}


0 commentaires