2013-08-26 12 views
8

Wann soll ich eine CancellationTokenSource entsorgen? Wenn ich zum Beispiel ein machen und es in Threads setzt jedes Mal klicken ich eine Taste:CancellationTokenSource, Wann muss ich disponieren?

private void Button_Click(object sender, EventArgs e) 
    { 
     if (clicked == false) 
     { 

      clicked = true; 
      CTSSend = new CancellationTokenSource(); 
      Thread1 = new Thread(() => Method1(CTSSend.Token)); 
      Thread1.Start(); 
      Thread2 = new Thread(() => Method2(CTSSend.Token)); 
      Thread2.Start(); 
     } 
     else 
     { 
      CTSSend.Cancel(); 
      CTSSend.Dispose(); 
      clicked = false; 
     } 
    } 

sollte ich es so entsorgen? Denn wenn es so ist, wird es ein bisschen problematisch sein, da ich es in den Disposser legen muss, der beim Schließen der Anwendung entsorgt wird, da es keine Garantie gibt, dass es nicht schon entsorgt wird, wenn ich nicht sorgfältig darauf warte , und das wird eine ObjectDisposedException verursachen.

Ich versuchte sogar mit diesem die Ausnahme zu verhindern (da ich Try Catch nicht verwenden möchte, möchte ich in diesem Fall nicht einmal den Fehler in erster Linie bekommen).

 if (CTSSend != null) 
     { 
      CTSSend.Cancel(); 
      CTSSend.Dispose(); 
     } 
     if (CTSReceive != null) 
     { 
      CTSReceive.Cancel(); 
      CTSReceive.Dispose(); 
     } 

Aber gut, vielleicht soll ich nur davon am Ende verfügt, und dont entsorgen es nach jedem Mal stornieren? Obwohl mir nicht gefällt, wie das einem neuen Objekt Ressourcen hinzufügen würde.

Wie geht es Ihnen mit diesen Fällen?

EDIT:

Eine konkretere Frage, die es (in meinem Fall) lösen.

Wie kann ich ein Bool an das CancellationToken binden? So kann ich etwas wie CTS.IsDisposed haben;

Einige Objekte haben das, aber CTS nicht, wenn es hätte, würde es das Problem lösen, das ich habe. Ich verwende derzeit einen Bool separat, was ich nicht bevorzuge.

+3

Es ist ein "Duplikat" ja, aber der andere bekommt nicht wirklich eine Antwort, jeder sagt anders. Einige sagen, es ist okay, es zu lassen, andere sagen, du musst es entsorgen. Und ich frage mich, wie Sie darüber verfügen können, ohne eine Chance auf eine Ausnahme zu haben, wenn Sie schließen, wenn es schon erledigt ist. – Zerowalker

Antwort

5

Sie haben hier eine Analyse When to dispose CancellationTokenSource? gemacht und es scheint, dass es ziemlich nutzlos ist, es richtig zu entsorgen. Lassen Sie den GC sammeln Sie es (und wenn Sie in fast allen Beispielen von MSDN es ist nicht entsorgt)

+2

'IDisposable'-Instanzen sollten entsorgt werden, auch wenn dies unbequem ist. –

+0

@SamuelNeff Also in Winforms-Apps sind alle Steuerelemente entsorgt? :-) Das Schlüsselwort hier ist "sollte", nicht "muss". – xanatos

+0

@SamuelNeff Ich füge hinzu, dass ich einige Nachforschungen angestellt habe ... Zum Beispiel über etwas wie "Task": http://StackOverflow.com/a/5986082/613130 ​​ – xanatos

Verwandte Themen