Dans une méthode C# à exécution longue, je souhaite lever une exception ou déclencher un événement après un certain nombre de secondes..NET Throw exception/raise event après X nombre de secondes
Est-ce possible?
Dans une méthode C# à exécution longue, je souhaite lever une exception ou déclencher un événement après un certain nombre de secondes..NET Throw exception/raise event après X nombre de secondes
Est-ce possible?
Vous pouvez le faire en utilisant une minuterie - réglez-le pour le délai que vous souhaitez et démarrez-le au début de la méthode. À la toute fin de la méthode, désactivez la minuterie - elle ne se déclenchera que si elle expire et que vous pouvez vous connecter à l'événement tick.
var timer = new Timer(timeout);
timer.Elapsed = ElapsedEventHanler; // Name of the event handler
timer.Start();
// do long running process
timer.Stop();
Je vous suggère de lire sur le different timer classes - cela vous permettra de savoir lequel d'entre eux est le mieux adapté à vos besoins particuliers.
Utilisation System.Threading.Timer:
System.Threading.Timer t;
int seconds = 0;
public void start() {
TimerCallback tcb = new TimerCallback(tick);
t = new System.Threading.Timer(tcb);
t.Change(0, 1000);
}
public void tick(object o)
{
seconds++;
if (seconds == 60)
{
// do something
}
}
Si vous avez l'intention d'arrêter une méthode longue de course alors je pense que l'ajout du support d'annulation à la méthode serait une meilleure approche au lieu de soulever l'exception.
Essayez ce qui suit, qui a une fonctionnalité d'annulation de l'exception (si le processus terminé) et soulève l'exception sur le fil source:
var targetThreadDispatcher = Dispatcher.CurrentDispatcher;
var tokenSource = new CancellationTokenSource();
var cancellationToken = tokenSource.Token;
Task.Factory.StartNew(() =>
{
var ct = cancellationToken;
// How long the process has to run
Task.Delay(TimeSpan.FromSeconds(5));
// Exit the thread if the process completed
ct.ThrowIfCancellationRequest();
// Throw exception to target thread
targetThreadDispatcher.Invoke(() =>
{
throw new MyExceptionClass();
}
}, cancellationToken);
RunProcess();
// Cancel the exception raising if the process was completed.
tokenSource.Cancel();
Utilisez [System.Timer] (http://msdn.microsoft .com/fr-fr/library/system.timers.timer.aspx) – Habib
Avez-vous essayé d'utiliser un 'Timer'? Je peux seulement penser que l'exception ne sera pas levée sur le thread sur lequel votre méthode s'exécute. – LukeHennerley
@Habib avez-vous considéré que l'exception se produira sur un thread différent et donc la méthode devrait très probablement continuer? Pas aussi simple que ça, je ne pense pas? – LukeHennerley