c# asynchrone sans attendre
Dans la documentation ici: http://msdn.microsoft.com/en-us/library/hh191443.aspx il indique que:
Si une méthode asynchrone n'utilisez pas attendre de l'opérateur à marquer d'une suspension
point, la méthode s'exécute comme une méthode synchrone, en dépit de la
async modificateur. Le compilateur émet un avertissement pour ces méthodes.
Je crois que c'est l'avertissement:
Cette méthode async le manque d '"attendre" opérateurs et exécuté de manière synchrone.
Pensez à utiliser le 'attendre d' " opérateur d'attendre de non-blocage des appels d'API,
ou 'attendent Tâche.Exécuter (...) " pour faire lié au PROCESSEUR de travailler sur un thread d'arrière-plan.
Puis, dans un autre, le lien référencé, http://msdn.microsoft.com/en-us/library/windows/apps/hh994635.aspx, l'exemple qu'il montre est comme suit:
public class Example
{
//...
private async void NextMove_Click(object sender, RoutedEventArgs e)
{
await Task.Run(() => ComputeNextMove());
//Update the UI with results
}
private async Task ComputeNextMove()
{
//...
}
//...
}
Ici, je vais assumer que ComputeNextMove
est fondamentalement une méthode synchrone, lui-même, de ne pas appeler vous attendent. Que puis semble contredire l'émission d'un avertissement du compilateur (sauf si c'est un mauvais exemple...)
Si je ne suis pas d'appeler un .net méthode Async à la FIN de mon appel asynchrone de la pile, comme HttpClient.GetStringAsync
et je tiens à le mettre en œuvre concrète "longue course" synchrone logique, est-il un plus bonne façon de le faire?
Peut-être que mon hypothèse est incorrecte, et ComputeNextMove
pourrait être déclaré comme private void ComputeNextMove()
qui donnerait pas d'avertissements.
Task.Run(Func<Task>)
, qui attend le retour de tâche.Le
Task
elle-même appelle await
."Si le code a async sans attendre, il est synchrone" - montre de code avec les deux: "je suppose que c'est synchrone." Je suis perdu.
OriginalL'auteur Novox | 2014-02-11
Vous devez vous connecter pour publier un commentaire.
Oui, c'est juste un mauvais exemple.
Si
ComputeNextMove
est vraiment juste une méthode synchrone qui n'a pas vraiment quoi que ce soit de manière asynchrone (comme la description l'indique), il ne devrait pas être déclarée commeasync
. Il devrait plutôt êtreprivate void ComputeNextMove()
.ComputeNextMove
va encore s'exécuter sur un thread d'arrière-plan en raison de l'utilisation deTask.Run
.Je serait très probablement utiliser une méthode de conversion de groupe au lieu d'une expression lambda ici:
HttpClient.GetStringAsync
à titre d'exemple), il me semble que c'est une Tâche quelque part qui les attendait.Il n'est pas toujours une tâche, même si elle est habituellement. Et oui, peu de gens seront d'écrire leur propre "primitive" de méthodes asynchrones. Vous finissent généralement aller vers le bas, peut - être par de nombreuses autres méthodes asynchrones - cadre *méthodes Asynchrones... ou la création d'une tâche à des fins spécifiquement synchrone de travail et que vous ne voulez pas le faire sur le thread courant.
Dans votre réponse, vous avez utilisé la méthode du groupe de coversion au lieu d'une lambda expression. Pourquoi donc ? Existe-il des avantages de performance pour le faire?
Non, il était juste un peu plus simple.
OriginalL'auteur Jon Skeet