2010-10-27 14 views
26

Ho un compito e mi aspetto che ci voglia in meno di un secondo per essere eseguito, ma se impiega più di qualche secondo voglio annullare l'operazione.Task.Wait (int) interrompe l'attività se il timeout è scaduto senza che l'attività termini?

Ad esempio:

Task t = new Task(() => 
     { 
      while (true) 
      { 
       Thread.Sleep(500); 
      } 
     }); 
t.Start(); 
t.Wait(3000); 

Si noti che dopo 3000 millisecondi l'attesa scade. L'attività è stata annullata quando è scaduto il timeout o l'attività è ancora in esecuzione?

+2

Perché non utilizzare l'annullamento API? –

+0

Qual è l'API di cancellazione? –

+0

controllare la mia risposta Ho messo alcuni collegamenti a riguardo –

risposta

12

Se si desidera annullare un Task, si dovrebbe passare a a CancellationToken quando si crea l'attività. Ciò ti consentirà di annullare il Task dall'esterno. Se lo desideri, potresti annettere l'annullamento a un timer.

Per creare un'attività con un token di cancellazione vedere questo esempio:

var tokenSource = new CancellationTokenSource(); 
var token = tokenSource.Token; 

var t = Task.Factory.StartNew(() => { 
    // do some work 
    if (token.IsCancellationRequested) { 
     // Clean up as needed here .... 
    } 
    token.ThrowIfCancellationRequested(); 
}, token); 

Per annullare la chiamata TaskCancel() sul tokenSource.

+3

Questo non ti permette solo di * richiedere * cancellazione "dall'esterno"? Non spetterebbe al delegato se presta attenzione alla richiesta basata su token e in effetti getta o continua a funzionare senza cancellazione? – BitMask777

+0

Corretto, il delegato decide se agire sulla richiesta controllando 'IsCancellationRequest' sulla proprietà. –

7

L'attività è ancora in esecuzione fino a quando non viene indicato esplicitamente di interrompere o il ciclo termina (cosa che non accadrà mai).

È possibile controllare il valore di ritorno di ora di vedere questo:

(da http://msdn.microsoft.com/en-us/library/dd235606.aspx) Valore di ritorno

Tipo: System.Boolean vero se la Task completato l'esecuzione nei tempi previsti; altrimenti, falso.

5

L'attività è stata annullata quando il timeout è scaduto o l'attività è ancora in esecuzione?

No e Sì.

Il timeout passato a Task.Wait è per il Wait, non l'attività.

+0

Questo è interessante, perché il testo di aiuto qui sembra dire il contrario: https://msdn.microsoft.com/en-us/library/dd270644(v=vs.110).aspx dice, _ "Aspetta che l'attività completi l'esecuzione entro un numero specificato di millisecondi . "_ Non sono sicuro di averlo capito ancora. –

+0

@Michael Se il tempo passato a 'Wait' scade, esso ritornerà, anche se l'attività non è stata completata. In questo caso di timeout, l'attività continuerà ad essere eseguita fino al suo completamento (e un successivo "Wait" verrebbe quindi restituito come completato). – Richard

47

Task.Wait() attende fino al periodo specificato per il completamento dell'attività e restituisce se l'attività è stata completata nel periodo di tempo specificato (o precedente) o meno. L'attività in sé non viene modificata e non si basa sull'attesa.

Leggi bella serie: Parallelism in .NET, Parallelism in .NET – Part 10, Cancellation in PLINQ and the Parallel class da Reed Copsey

E: .NET 4 Cancellation Framework/Parallel Programming: Task Cancellation

Controllare seguente codice:

var cts = new CancellationTokenSource(); 

var newTask = Task.Factory.StartNew(state => 
          { 
           var token = (CancellationToken)state; 
           while (!token.IsCancellationRequested) 
           { 
           } 
           token.ThrowIfCancellationRequested(); 
          }, cts.Token, cts.Token); 


if (!newTask.Wait(3000, cts.Token)) cts.Cancel(); 
+0

Grazie nick questo è un codice fantastico –

+0

Sono felice di aiutarti –

+0

Ho notato che anche il 'cts.Token 'è passato al metodo' Wait() '. Ho trovato una nota nella documentazione di Microsoft: _ "Passare l'oggetto CancelToken a questo metodo consente semplicemente l'attesa di essere annullata in base ad alcune condizioni." _ Https://msdn.microsoft.com/en-us/library/dd321457%28v = vs.110% 29.aspx –

Problemi correlati