Délai d'expiration de la tâche C #
Je dois exécuter un long processus de fonctionnement dans un thread et continuer en retournant le résultat d'une fonction. Voici mon code :
Task<ProductEventArgs>.Factory.StartNew(() =>
{
try
{
//long operation which return new ProductEventArgs with a list of product
}
catch (Exception e)
{
return new ProductEventArgs() { E = e };
}
}).ContinueWith((x) => handleResult(x.Result), TaskScheduler.FromCurrentSynchronizationContext());
Le problème est en réalité je n'ai pas de délai d'attente. J'ai envie de mettre une minuterie afin de retourner quelque chose comme ceci :
new ProductEventArgs() { E = new Exception("timeout") };
si le délai est atteint.
Ne pouvez pas utiliser les attendent/async.
Merci beaucoup !
source d'informationauteur Rototo
Vous devez vous connecter pour publier un commentaire.
Ce code fait ce que vous avez exprimé ici:
Comme vous le voyez
longRunningTask
est créé avecTaskCreationOptions.LongRunning
option. De cette façon, il aura un dédiéThread
pour son exécution et ne pas interférer avec le comportement normal deThreadPool
par l'occupation d'un thread il y a trop longtemps - qui seront nécessaires pour autre chose comme par exemple l'INTERFACE utilisateur. Qui est important pour les tâches longues.Remarque: Vous pouvez ensuite gérer
actualTask
avecContinueWith
mais j'ai voulu exprimer l'essence ici.Vous devez utiliser
CancellationToken
s:Vous pouvez utiliser retourné objet de tâche pour StartNew méthode, puis l'utilisateur d'Attendre méthode pour déterminer le délai d'attente.
Vous pouvez exécuter une
Task.Delay(timeout)
tâche en parallèle et vérifier ce que la tâche a été la première à terminer (Task.WhenAny()
est très pratique dans ce cas):Noter que cette solution n'a pas toute annulation de la logique, vos tâches en cours d'exécution sera toujours en cours d'exécution, même si c'.
Juste de commencer une autre tâche à l'intérieur de la tâche principale (de substitution):