Écrire une méthode Asynchrone qui attendent un bool
Je voudrais écrire une méthode qui await
pour une variable à true.
Voici le psudo code.
bool IsSomethingLoading = false
SomeData TheData;
public async Task<SomeData> GetTheData()
{
await IsSomethingLoading == true;
return TheData;
}
TheData
sera fixé par un Prisme Événement avec l' IsSomethingLoading
variable.
J'ai un appel à la GetTheData
méthode, mais je tiens à exécution asynchrone (à droite maintenant, il renvoie la valeur null si les données ne sont pas prêtes. (Qui conduit à d'autres problèmes.)
Est-il un moyen de faire cela?
Pourquoi ne pas utiliser une attente de la poignée?
il se sent comme quelque chose qui manque ici.. ne pas le
Je pense que je veux asynchrone attendre. (Mais je ne suis pas sûr.) Mon appel de méthode va définir un temps d'attente de l'indicateur sur une partie de l'écran. Lorsque l'appelant renvoie l'attente de l'indicateur sera supprimé. Mais j'ai besoin de l'INTERFACE utilisateur réactive pendant le temps de l'attente de l'indicateur est affiché. Le "Rappel" du style de Async/Await semble offrir ce...
Si vous allez être en utilisant le TPL beaucoup il est probable que vous n'avez pas à être l'aide d'un
Comme je l'ai montré dans ma réponse, vous pouvez utiliser un
il se sent comme quelque chose qui manque ici.. ne pas le
await IsSomethingLoading == true
plutôt être await InitiateLoading();
?Je pense que je veux asynchrone attendre. (Mais je ne suis pas sûr.) Mon appel de méthode va définir un temps d'attente de l'indicateur sur une partie de l'écran. Lorsque l'appelant renvoie l'attente de l'indicateur sera supprimé. Mais j'ai besoin de l'INTERFACE utilisateur réactive pendant le temps de l'attente de l'indicateur est affiché. Le "Rappel" du style de Async/Await semble offrir ce...
Si vous allez être en utilisant le TPL beaucoup il est probable que vous n'avez pas à être l'aide d'un
BackgroundWorker
beaucoup, ou pas du tout. Utilisez simplement Task.Run
d'effectuer des travaux dans un thread d'arrière-plan, await
la tâche, et puis tout le code qui utilise le résultat va au bout de la await
. Beaucoup plus rapide à écrire, plus facile d'erreur de manipulation, tout autour de la bonté.Comme je l'ai montré dans ma réponse, vous pouvez utiliser un
TaskCompletionSource
pour convertir le code à l'aide d'un modèle plus ancien dans un Task
, de sorte que vous pouvez ensuite await
, mais, idéalement, au fil du temps, ou pour de futurs produits, vous pouvez utiliser Task
tout le chemin à travers; il le rend plus facile si vous le faites.OriginalL'auteur Vaccano | 2013-02-27
Vous devez vous connecter pour publier un commentaire.
Dans de nombreuses situations comme cela, ce que vous avez besoin est un
TaskCompletionSource
.Vous avez probablement une méthode qui est capable de générer les données à un certain point dans le temps, mais il n'utilise pas une tâche à faire. Peut-être il ya une méthode qui prend un rappel qui fournit le résultat, ou un événement qui est déclenché pour indiquer qu'il y a un résultat, ou tout simplement le code à l'aide d'un
Thread
ouThreadPool
que vous n'êtes pas enclin à re-facteur en utilisantTask.Run
.Alors que vous pourriez avoir/vous fournir la
TaskCompletionSource
pour le travailleur, ou une autre classe, ou dans quelque autre manière à l'exposer à un plus large champ d'application, j'ai trouvé que c'est souvent pas nécessaire, même si c'est un très puissant option lorsque cela est approprié.Il est également possible que vous pouvez utiliser
Task.FromAsync
pour créer une tâche à partir d'une opération asynchrone, puis retour cette tâche directement, ouawait
dans votre code.OriginalL'auteur Servy
Vous pouvez utiliser un TaskCompletionSource que votre signal, et
await
que:Et dans votre Prisme de l'événement:
TCS<bool>
et pas unTCS<SomeData>
directement?OriginalL'auteur Bort