Comment “sommeil” jusqu'à l'expiration du délai d'annulation est demandée .NET 4.0
Quelle est la meilleure façon de dormir un certain temps, mais être en mesure d'être interrompu par un IsCancellationRequested
à partir d'un CancellationToken
?
Je suis à la recherche d'une solution qui fonctionne .NET 4.0.
Je voudrais écrire
void MyFunc (CancellationToken ct)
{
//...
//simulate some long lasting operation that should be cancelable
Thread.Sleep(TimeSpan.FromMilliseconds(10000), ct);
}
Vous devez vous connecter pour publier un commentaire.
J'ai juste écrit un billet à ce sujet ici:
CancellationToken et du Fil.Le sommeil
en Bref:
Dans votre contexte:
token.WaitHandle.WaitOne(TimeSpan.FromMilliseconds(5000));
mais il en substance, cela semble être le plus propre solution.token.WaitHandle.WaitOne(5000)
ct.WaitHandle
déclenche une exception si le sous-jacent CancellationTokenSource est éliminé. Assez facile à résoudre, avec une méthode d'extension..ct.WaitForCancellation(timespan)
qui peut revenir immédiatement si l'accès déclenche une exception. Doit être utilisé en conjonction avec un jeton d'annulation contrôles de pourrait conduire à une mauvaise interprétation 'sans attendre' la fois.Sinon, je pense que c'est assez clair:
Task.Delay(waitTimeInMs, cancellationToken).Wait(cancellationToken);
Pour annuler une opération asynchrone après un certain laps de temps tout en étant capable d'annuler l'opération manuellement, utilisez quelque chose comme ce qui suit
Ce sera la cause d'une annulation après cinq secondes. Pour annuler l'opération de votre auto tout ce que vous avez à faire est de passer la
token
dans votre méthode async et l'utilisation de latoken.ThrowifCancellationRequested()
méthode, où vous avez mis en place un gestionnaire d'événement, quelque part au feucts.Cancel()
.Donc un exemple complet est:
Où
stopButton
est le bouton que vous avez cliquez ici pour annuler la tâche en cours d'exécutionet la méthode est définie comme
Maintenant, pour vous permettre de travailler le fil, mais aussi de permettre à l'utilisateur d'annulation, vous aurez besoin d'écrire un "pompage" méthode
Note,
SomeAsyncMethod
sera de retour droit de l'appelant. Pour bloquer l'appelant ainsi, vous aurez à déplacer leTask
dans la hiérarchie d'appel.SpinWait
etSleep
.La meilleure solution que j'ai trouvé pour l'instant est:
Mise à JOUR:
La meilleure solution à ce jour est le accepté de répondre à.
La CancellationToken.WaitHandle peut lever une exception lors de l'accès après la CancellationTokenSource a été éliminé:
Dans certains cas, en particulier lorsque lié à l'annulation des sources sont éliminés manuellement (comme ils devraient l'être), cela peut être une nuisance.
Cette méthode d'extension permet de "safe annulation d'attente"; cependant, il doit être utilisé sur la collaboration avec les contrôles de, et le bon marquage, le jeton d'annulation de l'état et/ou de l'utilisation de la valeur de retour. C'est parce qu'il supprime les exceptions accéder à la WaitHandle et peut revenir plus vite que prévu.