Sicher anhalten long running task

Meine Frage ist, wie kann ich verhindern, dass eine lang laufende task (.net 4)? Ich habe umgesetzt TPL und versucht, mit dem CancellationTokenSource, aber es scheint nicht zu funktionieren für mein Szenario. Alle Beispiele, die ich gesehen habe davon aus, dass Sie die Arbeit in einer while-Schleife, so dass Sie überprüfen können, ob die Aufgabe wurde abgebrochen, während ich nur eine einzige operation, die dauert lange. Ich kann nicht warten, bis die arbeiten abgeschlossen werden, da muss ich annehmen, dass es vielleicht nie abgeschlossen.
Hier ist der code, den ich versucht habe:

        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.");
        }

Der code funktioniert, aber die Aufgabe ist nie freigegeben, wenn die "timeout" passiert, und die Arbeit, die getan wird, greift auf "unmanaged code", d.h. Ressourcen. Das sagte die IsCancelledRequested nicht verwendet werden kann, in Arbeit.LongRunning (), so kann ich nicht ThrowIfCancellationRequested.

Ich bin offen für andere Ideen, so gut wie ich haben versucht, BackgroundWorker, aber auch dass scheint nicht zu passen.

Neues Beispiel:

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();
        }

InformationsquelleAutor nickv | 2012-05-02

Schreibe einen Kommentar