2012-10-12 2 views
1

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?

+2

Utilisez [System.Timer] (http://msdn.microsoft .com/fr-fr/library/system.timers.timer.aspx) – Habib

+0

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

+1

@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

Répondre

2

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.

0

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 
    } 
} 
0

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.

0

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(); 
Questions connexes