2012-02-21 14 views
0

タスクには.Cancel.Waitの問題があります。それは多くの記憶と時間が必要です。C#タスク.Cancelには多くのメモリが必要で、スレッド内の.Abortと同じではありません。

タスク:私はスレッドを中止するために.Abortを使用するC#のスレッドで

using (CancellationTokenSource cancelSource = new CancellationTokenSource()) 
{ 
    CancelEventArgs args = new CancelEventArgs(false); 
    Task task = Task.Factory.StartNew(() => 
    { 
     try 
     { 
      action(args); 
     } 
     catch (Exception ex) 
     { 
      exception = ex; 
     } 
    }, cancelSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Current); 

    bool success = task.Wait(maxRuntime); 
    if (!success) 
    { 
     cancelSource.Cancel(); 
     return false; 
    } 
} 

。ここでは私が使用している仕事で.Cancel.しかし、私は.Cancelが多くのメモリと時間を要し、スレッド内で.Abortと同じではないと思います。

bool success = task.Wait(maxRuntime); 
if (!success) 
{ 
    cancelSource.Cancel(); 
    return false; 
} 

スレッドの例を使用している場合はどのようにメモリを減らすことができます:タスクをキャンセル

Thread workerThread = new Thread(threadStart); 

workerThread.Start(); 

bool finished = workerThread.Join(timeout); 
if (!finished) 
    workerThread.Abort(); 

return finished; 
+0

あなたはあなたが「考える」と言った。両方の方法のメモリ/時間消費量を測定しましたか? – Alex

+0

はい私はしました。そして、私はなぜタスクをキャンセルするとあまりにも多くのメモリを取るのか分かりません。私が問題があるかどうかわからない.Waitまたは.Cancel ... – senzacionale

+0

タスクがキャンセルされた場合はどこにでもチェックが表示されない。だから、取り消しを無視して完了まで走ります。回答のための – CodesInChaos

答えて

2

がスレッドを中止するとは根本的に異なっています。

スレッドを中止すると、中止したスレッドでThreadAbortExceptionが発生します。したがって、スレッド内で実行されるコードがこのメカニズムを認識していなくても、中止されます。

一方、タスクをキャンセルしても例外は発生しません。代わりに、CancellationToken.IsCancellationRequestedtrueであるかどうかを確認してから、OperationCanceledException例外を積極的にスローする必要があります。つまり、タスクによって実行されたコードがIsCancellationRequestedをチェックしていない場合、タスクはキャンセル要求に応答しません。
詳細についてはthis MSDN pageを参照してください。

+0

Thx。どうすればこのプロセスをスピードアップし、メモリを減らすことができますか?すぐにスレッドをキャンセルできますか? – senzacionale

+1

@senzacionale:あなたのタスク内のコードでは、 'IsCancellationRequested'をチェックし、それに応じて行動します。あなたが気づいたメモリの増加は、WaitまたはCancelの呼び出しとは関係ありませんが、タスク内のコードがキャンセル要求に応答していないため、コードが直ちに中止されないという事実があります。私の答えの最後のリンクを必ず読んでください! –

+0

私は記事を読んだ。だから私は、IsCancellationRequestedを使用してtrueであるかどうかをチェックし、このメソッドでexeceptuionをスローしてタスクをキャンセルすることをお勧めします。私は正しい? – senzacionale

関連する問題