2017-12-06 3 views
3

Ich möchte eine Aufgabe, die von einer Klasse aus einer anderen Klasse gestartet wurde, abbrechen. Unten ist ein Beispielprogramm, wo ich zwei Klassen habe und die Aufgabe von einer anderen Klasse abbrechen möchte. Das Löschungs-Token scheint nicht zu funktionieren.So stornieren Sie eine Aufgabe aus einer anderen Klasse

namespace threadingiwthcancel 
{ 
    class ThreadExample 
    { 
     public async Task PrintSomething(CancellationToken token) 
     { 
      int i = 0; 
      while (true) 
      { 
       if (token.IsCancellationRequested) 
       { 
        Console.WriteLine("Cancel requested"); 
        break; 
       } 
       await Task.Delay(TimeSpan.FromSeconds(1)); 
       Console.WriteLine(i); 
       i++; 
      } 

     } 
    } 
    class Cancel 
    { 
     public void cancelTask() 
     { 
      CancellationTokenSource source = new CancellationTokenSource(); 
      source.Cancel(); 
     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      CancellationTokenSource source = new CancellationTokenSource(); 
      CancellationToken token = source.Token; 
      callasyncmethod(token); 
      Thread.Sleep(TimeSpan.FromSeconds(2)); 
      Cancel c = new Cancel(); 
      c.cancelTask(); 
      Console.ReadLine(); 
     } 

     private static async void callasyncmethod(CancellationToken token) 
     { 
      ThreadExample te = new ThreadExample(); 
      await te.PrintSomething(token); 
     } 
    } 
} 
+0

versuchen, Antwort, lassen Sie mich weiß, es hat für dich funktioniert oder nicht –

Antwort

2

Annullierung Token scheint nicht zu funktionieren.

Der Grund für das Scheitern ist, dass Sie eine verschiedenenCancellationTokenSource und ruft Cancel darauf erstellen. Leider werden keine anderen Vorgänge gemeldet und Ihre ursprüngliche Aufgabe wird fortgesetzt.

Ich will eine Aufgabe von einer Klasse von einer anderen Klasse

Achten Sie darauf, übergeben Sie die original Quelle fing es an kündigen:

class Cancel 
{ 
    CancellationTokenSource _source; 

    public Cancel (CancellationTokenSource source) 
    { 
     _source = source; 
    } 

    public void cancelTask() 
    {    
     _source.Cancel(); 
    } 
} 

    static void Main(string[] args) 
    { 
     CancellationTokenSource source = new CancellationTokenSource(); 
     CancellationToken token = source.Token; 
     callasyncmethod(token); 
     Thread.Sleep(TimeSpan.FromSeconds(2)); 
     Cancel c = new Cancel(source); // pass in the original source 
     c.cancelTask(); 
     Console.ReadLine(); 
    } 
+0

ja das hat geklappt. Der Grund für diesen Beitrag ist, dass wir eine WPF-App mit mehreren Seiten mit jeweils einem Ansichtsmodell entwickeln. Auf einer Seite nach einem Klick klicken wir eine Async-Funktion (einige Hintergrundarbeit), die auch einen Ladebildschirm zeigt. Im Ladebildschirm haben wir eine Schaltfläche, um den Vorgang abzubrechen. Das Laden wird ausgeführt, wenn der Bildschirm an ein Modell mit einer Basisansicht und das vorherige an ein anderes Anzeigemodell gebunden ist, und wir möchten die asynchrone Operation abbrechen, die vom vorherigen Bildschirm gestartet wurde. Das Übergeben von Token als Parameter ist nicht möglich, da jede Ansicht ein Ansichtsmodellobjekt für Datenkontext erstellt –

0

wenn Sie wollen, so tun, als Sie Objekt von CancellationSoruce Sie Abbrechen Methode in anderen Klasse übergeben müssen, erstellen Sie keine neuen CancellationSoruce

class Cancel 
{  
public void cancelTask(CancellationTokenSource source) 
    { 
     source.Cancel(); 
    } 
} 

in Haupt

static void Main(string[] args) 
     { 
      CancellationTokenSource source = new CancellationTokenSource(); 
      CancellationToken token = source.Token; 
      callasyncmethod(token); 
      Thread.Sleep(TimeSpan.FromSeconds(2)); 
      Cancel c = new Cancel(); 
      c.cancelTask(source); 
      Console.ReadLine(); 
     } 

oder kann dies tun

class Cancel 
    { 
     private readonly CancellationTokenSource source; 
     public Cancel(CancellationTokenSource source) 
     { 
      this.source = soruce; 
     } 
     public void cancelTask() 
     { 
      source.Cancel(); 
     } 
    } 

und in Haupt

static void Main(string[] args) 
     { 
      CancellationTokenSource source = new CancellationTokenSource(); 
      CancellationToken token = source.Token; 
      callasyncmethod(token); 
      Thread.Sleep(TimeSpan.FromSeconds(2)); 
      Cancel c = new Cancel(source); 
      c.cancelTask(); 
      Console.ReadLine(); 
     } 
Verwandte Themen