2017-02-04 4 views
-4

Ich verwende eine asynchrone Methode. Wie kann ich die Ausführung stoppen, wenn ein Timer ein Timeout-Ereignis auslöst?Wie stoppe ich die asynchrone Methodenausführung in C#?

Mein Code:

public async Task<object> Method() 
{ 
    cts = new CancellationTokenSource(); 
    try 
    { 
     timer = new System.Timers.Timer(3000); 
     timer.Start(); 
     timer.Elapsed += (sender, e) => 
     { 
      try 
      { 
       timer_Elapsed(sender, e, cts.Token, thread); 
      } 
      catch (OperationCanceledException) 
      { 
       return; 
      } 
      catch (Exception ex) 
      { 
       return; 
      } 
     }; 
     await methodAsync(cts.Token); 
     return "message"; 
    } 
    catch (OperationCanceledException) 
    { 
     return "cancelled"; 
    } 
    catch (Exception ex) 
    { 
     return ex.Message; 
    } 
} 

// Async Call 
public async Task<object> methodAsync(CancellationToken ct) 
{ 
    try 
    { 
     pdfDocument = htmlConverter.Convert("path", ""); 
    } 
    catch(Exception ex) 
    { 
     return x.Message; 
    } 
} 

// Timer event 
void timer_Elapsed(object sender, ElapsedEventArgs e, CancellationToken ct) 
{ 
    cts.Cancel(); 
    ct.ThrowIfCancellationRequested(); 
} 
+2

Sie scheinen zu versuchen, den Code 'htmlConverter.Convert (" path "," ")' abzubrechen. Es gibt keine Möglichkeit, diesen Code zu stornieren, da Code, der storniert, in der Lage sein muss, auf das Stornierungs-Token zu antworten. Die einzige Antwort ist, dass Sie einen neuen Prozess hochfahren und ihn abbrechen müssen, wenn Sie abbrechen müssen. Andernfalls ist die einzige sichere Aktion, dass dieser Code vollständig ausgeführt wird. – Enigmativity

+0

Ich versuche nicht, diese 'pdfDocument = htmlConverter.Convert (" Pfad "," ");' Code zu stornieren. Versuchen Sie einfach, die Methode MethodeAsync() zu beenden. Gibt es einen Weg? –

+0

Das einzige, was in der 'methodAsync'-Funktion vor sich geht, ist der Aufruf von' .Convert', so dass man das gleiche aufhebt wie das andere. Sie können die Task/den Thread nicht zum Abbrechen zwingen. Sie müssen in der Lage sein, auf das Stornierungs-Token zu antworten, damit es funktioniert. – Enigmativity

Antwort

0

Ich glaube, Sie können versuchen, zu erwähnen, wenn es um abzubrechen. So etwas wie

cts.CancelAfter(TimeSpan.FromMilliseconds(5000)); 

Auch müssen Sie das Abbruch-Token in den aufgerufenen Methoden verwenden. Dann weißt du, wann du absagen musst.

1

Hier ist, wie eine Aufgabe Cancelling funktioniert:

public async Task<object> Method() 
{ 
    cts = new CancellationTokenSource(); 
    await methodAsync(cts.Token); 
    return "message"; 
} 

public Task<object> methodAsync(CancellationToken ct) 
{ 
    for (var i = 0; i < 1000000; i++) 
    { 
     if (ct.IsCancellationRequested) 
     { 
      break; 
     } 
     //Do a small part of the overall task based on `i` 
    } 
    return result; 
} 

Sie haben in der Eigenschaft von ct.IsCancellationRequested auf die Änderung zu reagieren zu wissen, wann die Aufgabe abzubrechen. Es gibt keinen sicheren Weg für einen Thread/eine Aufgabe, einen anderen Thread/Task abzubrechen.

In Ihrem Fall scheint es, dass Sie versuchen, eine einzige Methode aufzurufen, die nicht über die CancellationToken informiert, so dass Sie diese Aufgabe nicht sicher abbrechen können. Sie müssen den Thread/die Aufgabe bis zum Abschluss fortsetzen lassen.

Verwandte Themen