Renvoyer la tâche au lieu de Task & lt; TResult & gt; à partir de TaskCompletionSource
Comme je l'ai vu dans plusieurs des exemples de codeainsi que ce que je peux comprendre à partir de ce DONC, la question je devrais être en mesure de retourner un non-générique Tâche de TaskCompletionSource
(i.e., Return Task and not Task<TResult> from the method UploadFilesAsync)
Encore le code suivant:
public async Task UploadFilesAsync(string fileAPath, string fileBPath)
{
var tcs = new TaskCompletionSource<Object>();
//logic to process files
try
{
await Task.WhenAll(uploadFileAAsync(fileAPath),
uploadFileBAsync(fileBPath));
tcs.TrySetResult(null);
}
catch (Exception e)
{
tcs.SetException(e);
}
finally
{
//logic to clean up files
}
return tcs.Task;
}
Produit suivantes erreur de syntaxe
'UploadFilesAsync(string, string)' is an async method that returns 'Task',
a return keyword must not be followed by an object expression.
Did you intend to return 'Task<T>'?
Je suis ciblage .NET 4.5. Je sais qu'il peut travailler pour le retour de la Tâche(de l'objet), mais qui fait de l'API se sentir "sale". Est-il recommandé de retourner à la Tâche(de l'objet) ou est-il possible de retourner à la Tâche (non générique, comme indiqué dans le code)?
source d'informationauteur Jonathan Harrison
Vous devez vous connecter pour publier un commentaire.
Bien, ce n'est pas ce que vous attendez.
Le problème, c'est que vous essayez de revenir une tâche... et une méthode asynchrone automatiquement encapsule la valeur de retour dans une autre tâche. Il n'est pas clair pourquoi vous êtes en utilisant une méthode asynchrone à tous ici, pour être honnête. Pourquoi ne pas simplement écrire ceci:
N'est-ce pas faire ce que vous voulez? Vous voulez juste une tâche qui se termine lorsque les deux "sous-opérations" ont terminé, non? C'est exactement ce que
Task.WhenAll
retourne. Votre méthode est non-bloquant - il ne pas attendre jusqu'à ce que les opérations soient terminées avant il retourne. C'est juste que vous êtes en utilisant le fait queTask.WhenAll
est non-bloquante pour y parvenir, au lieu d'une méthode asynchrone.EDIT: Notez que si vous vouliez faire quelque chose d'autre dans cette méthode, vous pourriez faire une méthode asynchrone sans l'aide de
TaskCompletionSource
vous-même:Noter que même si la méthode async ici renvoie
Task
vous n'avez pas de valeur de retour - la async/await machines gère tout pour vous, de retour d'une tâche qui sera complétée quandMaybeDoSomethingCheap()
a fini, ou faute si une exception est levée.Autant que je sache, il n'existe pas de moyen direct pour retourner un
Task
objet lors de l'embauche deTaskCompletionSource<T>
.En général, je préfère retourner un
Task<bool>
type d'objet à ces situations. Mais vous avez raison, le retour d'un type générique de l'objet n'a pas de sens si les valeurs de retour de la fonction n'est pas utilisable.Mais en fait, vous n'avez pas besoin de créer un
TaskCompletionSource
puisque vous avez unawait
mot-clé à l'intérieur de la fonction.TaskCompletionSource
est généralement utilisé pour convertir une fonction synchrone à un asynchrones. Puisque vous êtes déjà à l'appel d'une fonction asynchrone (et en fait, c'semble que la seule fonctionnalité de), vous n'avez pas besoin de créer unTaskCompletionSource
.