HttpClient GetStringAsync - Il ne revient jamais
Nouveau ASP.NET l'API Web HttpClient m'a donne de drôles de résultats. Voici mon code:
class Program {
static async void Main(string[] args) {
var address = "http://localhost:3895/api/urls";
Console.WriteLine(await getStringAsync(address));
Console.ReadLine();
}
public static async Task<string> getStringAsync(string uri) {
var httpClient = new HttpClient();
return await httpClient.GetStringAsync(uri);
}
}
Cela ne revient pas et la console apparaît soudainement et disparaît. Lorsque je modifie le code comme ci-dessous, il fonctionne comme il est censé:
static void Main(string[] args) {
var address = "http://localhost:3895/api/urls";
Console.WriteLine(getString(address));
Console.ReadLine();
}
public static string getString(string uri) {
var httpClient = new HttpClient();
return httpClient.GetStringAsync(uri).Result;
}
La moindre idée de ce que serait le problème?
Qui n'a même pas compiler. Un point d'entrée (
Dans la Async CTP, il est permis (mais une mauvaise idée)
Intéressant. Le meilleur qu'ils refuser maintenant.
merci les gars, j'essayais de voir si l'application fonctionne. Ainsi, l'application de console est juste un test. mais bon pour le savoir. Je vais essayer ça ailleurs.
La même idée est titulaire pour les tests unitaires. Juste assurez-vous d'utiliser
Main
) ne peut pas être asynchrone. Il échouera avec l'CS4009 erreur.Dans la Async CTP, il est permis (mais une mauvaise idée)
Intéressant. Le meilleur qu'ils refuser maintenant.
merci les gars, j'essayais de voir si l'application fonctionne. Ainsi, l'application de console est juste un test. mais bon pour le savoir. Je vais essayer ça ailleurs.
La même idée est titulaire pour les tests unitaires. Juste assurez-vous d'utiliser
async Task
plutôt que async void
. Ce dernier est une forme de fire-and-forget.OriginalL'auteur tugberk | 2012-03-26
Vous devez vous connecter pour publier un commentaire.
async
surMain
est rejetée dans le VS11/.NET 4.5 compilateur, donc je suis en supposant que vous êtes à l'aide de la Async CTP. Si vous l'utilisez .NET 4.5 est une option, faire de l'interrupteur.Cela de côté, la raison pour laquelle cela ne fonctionne pas est parce que
async
, ou, plus généralement, les tâches, compter sur d'être en mesure de signal d'une certaine façon pour le reste de l'exécution d'un code. Il fonctionne avec.Result
parce que le code s'exécute de manière synchrone, le problème ne s'applique pas.Il n'y a pas de prise en charge intégrée pour les applications de console, car ils n'ont pas l'habitude d'utiliser la boucle de message dans la façon que, par exemple, WinForms, mais vous pouvez toujours regarder
Microsoft Visual Studio Async CTP\Samples\(C# Testing) Unit Testing\AsyncTestUtilities
, notammentGeneralThreadAffineContext.cs
, pour obtenir un exemple de base qui fonctionne dans les applications de console trop.OriginalL'auteur