J'essaie actuellement de mettre en œuvre un substitut de la tâche Task.Delay () CODE> Méthode dans un programme qui doit cibler .NET 4.0. J'ai trouvé le code suivant à Ce blog .
Task Delay (int milliseconds, CancellationToken token) // Asynchronous NON-BLOCKING method
{
var tcs = new TaskCompletionSource<object>();
new Timer (_ => tcs.SetResult (null)).Change (milliseconds, -1);
return tcs.Task;
}
3 Réponses :
J'aime Ce :
token.Register(() => tcs.TrySetCancelled());
Où va-t-il dans le contexte? Pardonne-moi si cela semble évident, il y a plusieurs concepts nouveaux pour moi ici.
J'ai essayé de changer votre code le moins possible, mais voici un exemple de travail qui se comporte de la même manière que la tâche.
Il est important de noter que j'utilise NOTEZ aussi une tâche annulée lancera une lire un peu plus dans votre question. Si vous avez besoin de tâches.delay et que vous ciblez .NET 4.0, vous devez utiliser le package Microsoft Async Nuge de http://www.nuget.org/packages/microsoft.bcl.async/ Il contient la méthode trysetcanceled code> et
trysetreresult code> car la minuterie pourrait finir après l'annulation de la tâche. Idéalement, vous voulez arrêter la minuterie. P>
taskex.delay code> p> p>
C'est une grande réponse à deux fois. En fait, j'ai déjà eu Microsoft.bcl.Async installé dans mon projet, mais je ne me suis pas réalisé qu'ils cachaient ces méthodes sous Taskex. Merci pour l'explication à long terme du contexte et la pointe de l'extension de la BCL.
Initialiser une annulationTokensource avec un délai d'attente n'est pas possible dans .NET 4.0
Vous êtes ici une version qui empêche l'élimination de la minuterie par le collecteur des ordures
Microsoft fournit un package Nuget Microsoft.bcl.async qui porte beaucoup de Ajouté 4.5 Caractéristiques à 4.0. Vous pouvez accéder à retard via
taskex.delay () code> si vous avez le package.