2013-08-26 9 views
8

CancellationTokenSourceを破棄するのはいつですか? 私は、例えば1を作り、私はボタンをクリックするたびスレッドにそれを置く場合:CancellationTokenSource、いつ処分するのですか?

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

私はそのようにそれを処分することになっているだろうか? もしそうなら、私は注意深くそれを待っていない場合は、すでに廃棄されていないことを保証していないので、アプリケーションが終了したときに処分するDisposerに入れる必要があるので、少し問題になります。それによってObjectDisposedExceptionが発生します。

私は例外を防ぐためにこれを試してみました(私はTry Catchを使用しないようにしていますが、この場合はエラーが最初に出ます)。

しかし、私は最後にそれを処分し、毎回取消し後に廃棄しないでください。 私はそれが新しいオブジェクトにリソースを追加し続ける方法が好きではありませんが。

あなたはどのようにこれらのケースで人々はしますか?

EDIT:

(私の場合)、それを解決するより具体的な質問。

どうすればBoolをCancellationTokenにバインドできますか? だから私はCTS.IsDisposedのようなものを持つことができます。

いくつかのオブジェクトがありますが、CTSはそれがあれば私の持つ問題を解決しません。 私は現在、boolを別々に使用しています。これは好きなものではありません。

+3

これは「重複」しますが、実際には答えは得られません。ある人は、それを許しても大丈夫だと言い、他の人はあなたがそれを処分しなければならないと言います。そして、私は、既に処分されている場合は、あなたが閉じるときに、例外のチャンスを持たずに、それをどのように処分することができますか? – Zerowalker

答えて

5

ここではいくつかの分析を行いましたが、When to dispose CancellationTokenSource?と正確に処理しようとするとかなり役に立たないようです。 GCがそれを集めるようにしてください(MSDNのほぼすべての例を見ると、それは処分されません)

+2

「IDisposable」インスタンスは、不便な場合でも削除する必要があります。 –

+0

@ SamuelNeffしたがって、Winformsアプリケーションでは、すべてのコントロールが破棄されますか? :-)ここのキーワードは "should"であり、 "must"ではありません。 – xanatos

+0

@SamuelNeff私はいくつかの研究をしたと付け加えます...例えば、「タスク」のようなものに接続した場合:http://stackoverflow.com/a/5986082/613130 – xanatos