attendent AsyncMethod() rapport attendent des attendent des Tâches.Usine.StartNew<TResult>(AsyncMethod)
Compte tenu de la méthode suivante:
public async Task<MyObject> DoSomethingAsync() {
//do some work
await OpenSomeFileAsync();
return new MyObject();
}
Est-il une différence entre:
public async void SomeEventHandler(EventArgs args) {
var myObject = await await Task.Factory.StartNew<Task<MyObject>>( DoSomethingAsync);
//do something with myObject
}
et:
public async void SomeEventHandler(EventArgs args) {
var myObject = await DoSomethingAsync();
//do something with myObject
}
Je pensais que le "travail" de DoSomethingAsync arriverait-il immédiatement dans une nouvelle tâche dans le premier cas, mais pour être honnête, je n'ai pas vraiment de bien comprendre comment les Tâches, async et await sont travail, et je suis assez sûr que je suis juste de compliquer à l'excès des choses pour moi-même.
EDIT:
Cette question est venue de regarder ce Métro exemple:
http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782
Spécifiquement en de la page d'accueil.xaml.cs, ils ont cette:
var unused = Task.Factory.StartNew(async () => { //some work... });
//unused is of type Task<TResult>
J'ai essayé de retravailler sans l'aide d'un anonyme en fonction async et j'ai commencé à me demander, pourquoi ne pas simplement écrire une méthode async et await, au lieu d'appeler StartNew et de la remise en fonction async?
async
/await
mots-clés de sorte que vous n'avez pas à.Ressemble à un mauvais exemple morceau de code de la main gauche
J'ai juste pris un coup d'oeil moi-même, et... Wow. Ouais, c' "Officielle de Windows SDK de l'Échantillon" le code est vraiment mauvais! Je pense qu'ils ont réussi à complètement à côté du point de
async
!
OriginalL'auteur Justin Lang | 2012-07-17
Vous devez vous connecter pour publier un commentaire.
La plupart du temps, l'ajout d'un autre
Task
n'est pas utile, mais dans certains cas, il peut être.La différence est que si vous êtes sur le thread d'INTERFACE utilisateur (ou quelque chose de similaire) et d'exécuter
DoSomethingAsync()
directement, sa première partie (//do some work
) sera également exécuter dans le thread de l'INTERFACE utilisateur, ainsi que la poursuite des pièces de la méthode (sauf s'ils utilisent desConfigureAwait()
). D'autre part, si vous lancez un autreTask
, à la fois la première partie et les suivantes pièces deDoSomethingAsync()
exécutera sur leThreadPool
.Si
DoSomethingAsync()
est écrit correctement, en ajoutant un autreTask
ne devrait pas vous donner tous les avantages (et vous donnera l'inconvénient de plus en hauteur), mais je peux l'imaginer il y a des cas où il faire une différence.Aussi, au lieu d'utiliser
Task.Factory.StartNew()
et deuxawait
s, vous pouvez écrire:Très bonne réponse, merci à tous pour la réponse!
OriginalL'auteur svick
Oui, il y a une différence: dans le premier formulaire, vous avez un niveau supplémentaire de la Tâche, qui apporte absolument rien d'utile.
La première forme est essentiellement équivalent à ceci:
De sorte qu'il n'a pas vraiment de sens: vous êtes à la création d'une tâche... crée une autre tâche.
AFAICT, c'est un mauvais exemple
Je suis d'accord avec James, c'est un très mauvais exemple... il n'y a pas de raison de créer une tâche sur une méthode asynchrone, car il renvoie déjà une tâche
Il y a est de la différence entre les deux (et je ne parle pas seulement de frais généraux), voir ma réponse.
OriginalL'auteur Thomas Levesque