La mia domanda è: come posso interrompere un'attività a esecuzione prolungata (.net 4)? Ho implementato TPL e ho provato ad usare CancellationTokenSource ma non sembra funzionare per il mio scenario. Tutti gli esempi che ho visto presuppongono che tu stia lavorando in un ciclo while in modo da poter verificare se l'attività è stata annullata, mentre ho solo una singola operazione che richiede molto tempo. Non vedo l'ora che il lavoro sia completato, perché devo presupporre che non possa mai essere completato. Ecco il codice che ho provato:Arresto sicuro dell'attività a esecuzione lunga
bool? result = null;
var cs = new CancellationTokenSource();
var ct = cs.Token;
var doWorkTask = new Task(() =>
{
Console.WriteLine("start dowork task");
result = Work.LongRunning();
}, ct);
doWorkTask.Start();
Task.WaitAny(new Task[] { doWorkTask }, timetowait);
if (doWorkTask.IsCompleted)
{
Console.WriteLine("dowork task completed");
doWorkTask.Dispose();
}
else
{
Console.WriteLine("dowork task has timedout");
cs.Cancel();
throw new TimeoutException("Timeout hit.");
}
Il codice funziona ma il compito non è mai disposta se il “timeout” accade e il lavoro che si sta facendo accessi “codice non gestito” vale a dire le risorse. Detto questo, IsCancelledRequested non può essere utilizzato in Work.LongRunning(), quindi non posso ThrowIfCancellationRequested.
Sono aperto ad altre idee così come ho provato con BackgroundWorker ma anche questo non sembra adattarsi.
nuovo esempio: Parallel Library
var service = new System.ServiceProcess.ServiceController(ServiceName, ServerName);
var serviceTask = Task.Factory.StartNew(() =>
{
result = (service.Status == ServiceControllerStatus.Running
|| service.Status == ServiceControllerStatus.StartPending);
}, cs.Token);
serviceTask.Wait(2000, cs.Token);
if (!serviceTask.IsCompleted)
{
cs.Cancel();
}
Grazie per la risposta! Ho guardato il pattern Begin \ End, ma poi per controllare un risultato sul comando End ((Task) isyncResult). Esegui il backup fino a quando non viene completato. Ho fatto un aggiornamento sul mio esempio. Poiché le proprietà sul ServiceController sembrano essere pigri caricati non appena si verifica un valore, potrebbe richiedere quanto mai lungo ... –
nickv
Devo ammettere che non riesco a seguire completamente il codice, ma perché non si aggiungono continuazioni con ContinueWith ? – Stilgar
Perché non desidero continuare con una nuova attività. Ho un compito che voglio eseguire, quell'attività potrebbe non sostenere una risposta a causa di qualsiasi cosa così il compito sarà in uno stato di esecuzione per sempre anche se è stato chiamato Annullato. – nickv