Comment arrêter l'exécution d'une méthode, après un moment précis?
J'ai besoin d'arrêter l'exécution d'une méthode si elle n'est pas terminée à l'intérieur d'une période de temps limitée.
Pour faire ce travail, je peux utiliser les Thread.Abort
méthode de cette façon:
void RunWithTimeout(ThreadStart entryPoint, int timeout)
{
var thread = new Thread(() =>
{
try
{
entryPoint();
}
catch (ThreadAbortException)
{ }
}) { IsBackground = true };
thread.Start();
if (!thread.Join(timeout))
thread.Abort();
}
Étant donné que je suis en utilisant .NET 3.5, est-il un meilleur moyen?
Edit: suite aux commentaires, voici mon entryPoint
, mais je suis à la recherche d'un bon moyen pour tout entryPoint
.
void entryPoint()
{
//I can't use ReceiveTimeout property
//there is not a ReceiveTimeout for the Compact Framework
socket.Receive(...);
}
Voulez-vous lancer une ThnreadAbortException sans utiliser de Fil.Abandonner, ou voulez-vous arrêter l'exécution d'une méthode, après un délai d'attente?
la deuxième: arrêter l'exécution d'une méthode après un délai d'attente
stackoverflow.com/questions/299198/...
Envisagez l'utilisation d'une Tâche de la Bibliothèque Parallèle avec un CancellationToken.
La réponse est pire que ma solution...
la deuxième: arrêter l'exécution d'une méthode après un délai d'attente
stackoverflow.com/questions/299198/...
Envisagez l'utilisation d'une Tâche de la Bibliothèque Parallèle avec un CancellationToken.
La réponse est pire que ma solution...
OriginalL'auteur Nick | 2012-11-07
Vous devez vous connecter pour publier un commentaire.
Réponse dépend de "l'œuvre". Si le travail est quelque chose qui peut être arrêté en toute sécurité (pas des e/S opération de blocage) - utilisation
Backgroundworker.CancelAsync(...)
Si vous n'avez pas à couper dur je voudrais examiner à l'aide d'un
Process
, auquel cas leAborting
processus est plus propre - etprocess.WaitForExit(timeout)
est votre ami.Suggéré TPL est grande, mais, malheureusement, n'existe pas .Net 3.5.
EDIT: Vous pouvez utiliser Réactif Extensions à suivre Jan de Vaan la suggestion.
Voici ma 'action timeout' snip - c'est principalement ici pour les autres de commenter:
MODIFIER: Apparemment ce n'est pas exactement ce que l'OP voulait. Voici ma tentative de mettre au point un " annulable prise récepteur:
Yap. Peut-on voir le DoWork' ?
Voir modifier, mais (comme je l'ai écrit), je préfère un bon moyen pour n'importe quel point d'entrée.
En Évitant De Fil.Avorter est toujours une bonne idée. Pour l'éviter il sur un sujet que vous n'avez pas créé, c'est encore mieux. Comment Arrêter un Thread .NET (et Pourquoi Thread.Avorter est Mal) interagissent-sw.co.royaume-uni/iangblog/2004/11/12/annulation les Dangers de Fil.Abandonner par Eric Lippert blogs.msdn.com/b/ericlippert/archive/2010/02/22/...
OriginalL'auteur
Fil de discussion.Avorter est généralement une mauvaise solution. Vous devez utiliser un flag indiquant si l'opération est annulée et vérifier à l'intérieur de votre point d'entrée de la fonction.
Une autre solution est d'utiliser un processus enfant... mais c'est plus consommateur de ressources.
OriginalL'auteur Andrei Schneider