Voulez comprendre async
J'ai utilisé asynchrone à coder un peu, mais je n'ai pas vraiment bien comprendre comment l'utiliser, même si je comprends le concept, et pourquoi j'en ai besoin.
Voici mon set up:
J'ai une API Web que je vais appeler à partir de mon ASP.NET MVC application et de mon site Web API appel DocumentDB. Dans les exemples de code, je vois que beaucoup attendent des mots-clés lors de l'envoi de requêtes de DocumentDB.
Je suis confus si j'ai besoin de faire mon Index, méthode d'action dans mon MVC application asynchrone?
Je suis aussi confus si mon CreateEmployee() la méthode dans mon Web API asynchrone?
Quelle est la bonne façon de l'utiliser asynchrone dans ce scénario?
Voici mon code (Ce code est actuellement en me donnant des erreurs parce que mon MVC méthode d'action n'est pas asynchrone)
---- ASP.NET MVC le Code de l'Application ----
public ActionResult Index()
{
Employee emp = new Employee();
emp.FirstName = "John";
emp.LastName = "Doe";
emp.Gender = "M";
emp.Ssn = "123-45-6789";
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://myWebApi.com");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.PostAsJsonAsync("hr/create/newemployee", emp);
if (response.IsSuccessStatusCode)
{
emp = await response.Content.ReadAsAsync<Employee>();
}
}
//Display employee info
return View(emp);
}
---- API Web Code ----
private static readonly string endPointUrl = ConfigurationManager.AppSettings["EndPointUrl"];
private static readonly string authorizationKey = ConfigurationManager.AppSettings["AuthorizationKey"];
private static readonly string databaseId = ConfigurationManager.AppSettings["DatabaseId"];
private static DocumentClient client;
public static async Task<Employee> CreateEmployee(Employee emp)
{
try
{
//Create a Document client
using (client = new DocumentClient(new Uri(endPointUrl), authorizationKey))
{
//Get the database
var database = await GetDatabaseAsync();
//Get the Document Collection
var collection = await GetCollectionAsync(database.SelfLink, "Employees");
await client.CreateDocumentAsync(collection.SelfLink, emp);
//Further process employee
}
}
catch
{
//Handle error
}
return employee;
}
private static async Task<DocumentCollection> GetCollectionAsync(string dbLink, string id)
{
DocumentCollection collection = client.CreateDocumentCollectionQuery(dbLink).Where(c => c.Id == id).ToArray().FirstOrDefault();
return collection;
}
private static async Task<Database> GetDatabaseAsync()
{
Database database = client.CreateDatabaseQuery().Where(db => db.Id == databaseId).ToArray().FirstOrDefault();
return database;
}
OriginalL'auteur Sam | 2014-11-25
Vous devez vous connecter pour publier un commentaire.
vous ne pouvez utiliser
await
à l'intérieur d'une méthode si cette méthode estasync
etasync
méthodes de besoin de retournerTask
,Task<T>
ouvoid
bien quevoid
retourasync
méthodes sont réservés pour les gestionnaires d'événements, car les exceptions levées dans les sont avalés et vous ne pouvez pasawait
de leur achèvement ou de la chaîne des tâches suivantes.Je pense que votre
Index
action doit êtreasync
et retourner unTask<ActionResult>
et votreCreateEmployee
méthode doit êtreasync
ainsi que c'est à l'aide deawait
à l'intérieur.Voir Les meilleures Pratiques dans la Programmation Asynchrone pour certaines des lignes directrices sur la façon d'utiliser
async-await
OriginalL'auteur Ned Stoyanov
Voici mon explication
Finalement les deux
Approach1
etApproach2
sont identiques morceaux de code.La
async/await
est sucre syntaxique autour de la Tâche de l'API. Il prend votreasync
méthode divise en plusieurs parties avant deawait
, et aprèsawait
. Le "avant" la partie est exécutée immédiatement. "L'après" la partie est d'obtenir exécutée lorsqueawait
opération est terminée. Vous êtes capable de suivre la deuxième partie de l'opération via l'API de Tâches puisque vous obtenez une référence à une Tâche.En général
async
permet de traiter un appel de méthode comme une sorte de fonctionnement longue durée qui vous permet de référencer via l'API de Tâches et attendre qu'il est fini et continuer avec un autre morceau de code. Soit par l'intermédiaire deContinueWith
appel de via à l'aide deawait
en général c'est la même chose.Avant
async
/await
/Task
concepts de gens ont été en utilisant des rappels, mais les erreurs de manipulation a été aussi facile que l'enfer, leTask
est semblable à un concept decallback
sauf qu'il est en mesure de permettre la manipulation des exceptions de plus en plus facilement.En général tous cette Tâche/async/await mantra est proche de la notion de
promises
si vous avez travaillé avec jQuery/JavaScript, il y a un concept similaire, voici une belle question en expliquant comment il est fait, il y a "jQuery deferreds et de promesses .alors() vs .done()"Modifier: je viens de trouvé .NET manque de mise en œuvre de
then
des fonctionnalités similaires à celle qui se trouve en jQuery/JavaScript.La différence entre
ContinueWith
etThen
est queThen
est capable de composer de la tâche, et à exécuter l'une après l'autre tandis queContinueWith
n'est pas, il est capable seulement de lancer des tâches en parallèle, mais il peut être facilement mis en œuvre par l'attendent de construire. Voici mon code mis à jour contenant tout le toutim:OriginalL'auteur Lu4
Ils sont difficiles à comprendre.
Tout d'abord, dans vos méthodes de l'API Web, vous utilisez asynchrone sans attendre. Je suis sûr que vous obtenez des erreurs /d'avertissement il y a droit?
--
async attendent sont utilisés pour renvoyer le fil de retour à l'appelant lorsque vous êtes en attente pour les e/S d'être terminé. Donc, oui, vous voulez l'utiliser à la fois dans votre MVC et Web API côté. Assurez-vous de bien comprendre cette phrase avant de passer.
--
La chose à propos de async /await, c'est que, si vous l'utilisez, vous devez utiliser TOUT le chemin à travers l'appel de fonctions, ou bien il n'est pas judicieux (et vous aurez des messages d'erreur /d'avertissement de trop). Cela signifie que, quelle que soit la bibliothèque que vous utilisez doit prendre en charge. Dans ce cas, "DocumentClient". Par convention, les méthodes de soutien, il va finir en "Async" et il sera de retour une Tâche qui vous attend.
--
Donc votre réponse courte:
utiliser asynchrone attendent dès le début (la manette), et essayer de le faire attendre ce que les opérations longues il appelle. Si c'est aussi votre code, vous devriez être en mesure d'attendre ... et attendre ... jusqu'à ce que finalement vous appeler quelque chose qui n'est pas votre code. Si vous pouvez attendre que le code qui n'est pas le vôtre, alors vous êtes fixés. Si vous ne pouvez pas, alors vous ne devriez pas utiliser asynchrone attendent forme le début.
(pas de sens)
OriginalL'auteur hatcyl