2012-03-31 11 views
0

タスクを返す非同期メソッドがあります。時々、私のプロセスはリサイクル/再開しています。仕事は仕事の途中で中断しています。 TPLに多かれ少なかれ一般的なアプローチがありますが、少なくともタスクが中断されたことを記録できますか?TPLでグローバルtry..finallyの種類を実装する方法は?

  1. 私はASP.NETでホスティングしていますので、IRegisteredObjectを使用してCancellationTokenでタスクをキャンセルすることができます。しかし、私はこれが好きではありません。私はすべての方法でCancellationTokenを渡す必要があり、私はそれらの多くを持っています。
  2. try ...最終的には、それぞれの方法ではあまり上がらないようです。続けると動作しない

アドバイスはありますか?

私は自分の非同期タスクを開始しますが、各タスクは任意の数の子タスクを持つことができます。アイデアを得るには:

class CommandRunner 
{ 
    public Task Execute(object cmd, Func<object, Task> handler) 
    { 
    return handler(cmd).ContinueWith(t => 
    { 
     if (t.State = == TaskStatus.Faulted) 
     { 
      // Handle faultes, log them 
     } 
     else if (x.Status == TaskStatus.RanToCompletion) 
     { 
      // Audit 
     } 
    }) 
    } 
} 
+1

コードを提供できますか?サンプルコードと擬似コードで十分です。 – usr

+0

@usr、私はいくつかのコードを追加しました –

答えて

0

タスクは何とか「中断」するだけではありません。彼らはいつも完了、失敗、またはキャンセルされます。これらの補完について知るための世界的なフックはありません。したがって、あなたのロギングを行う唯一のオプションは、あなたのタスクの本体を計測するか、すべての継続を引き継ぐことです。

+0

時々ASP.NETリサイクルプロセス。プロセスのリサイクル時に何が起こるのですか? –

+0

すべてのスレッドは.Abort()です。つまり、スレッド例外の発生を示します。スティーブン・トゥブは次に何が起こるかを説明します:http://social.msdn.microsoft.com/Forums/ta/parallelextensions/thread/894007ae-d9ea-4803-9ae3-952b66896117 – usr

+0

ContinueWithでThreadAbortedExceptionが発生しない主な問題です。そして、それを処理することはできません。 –

関連する問題