Ho un pulsante UI chiamato Load. Genera una discussione, che a sua volta genera un'attività. C'è un'attesa sull'attività e, se scade, l'attività viene annullata. Il pulsante Carica non è disattivato e l'utente può fare clic su di esso più volte. Ogni volta che viene cliccato, il compito precedente deve essere canelled.CancellationToken and CancellationTokenSource-Come si usa?
Mi sto confondendo su come dovrei usare CancellationTokenSource e CancellationToken qui. Beow è il codice ... puoi suggerire come usarlo e se l'utilizzo sottostante ha qualche problema? No Async, per favore, perché non siamo ancora arrivati.
CancellationTokenSource _source = new CancellationTokenSource();
public void OnLoad()
{
//Does this cancel the previously spawned task?
_source.Cancel();
_source.Dispose();
_source = new CancellationTokenSource();
var activeToken = _source.Token;
//Do I need to do the above all the time or is there an efficient way?
Task.Factory.StartNew(() =>
{
var child = Task.Factory.StartNew(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(20));
activeToken.ThrowIfCancellationRequested();
}, activeToken);
if (!child.Wait(TimeSpan.FromSeconds(5)))
{
_source.Cancel();
}
});
}
Nota ho bisogno di cancellare eventuali compiti precedentemente deposto le uova, e ogni compito generato dovrebbe avere un timeout.
Penso che ci sia una costruito nel modo di cancellare un segno dopo un certo timeout. – CodesInChaos
http://stackoverflow.com/a/16607800/34397 – SLaks
@ SLaks: non funzionerà come sono su .NET 4.0 – Mike