2011-10-18 7 views
2

MSDNでは、特定のアクションにトレースを割り当てる方法について、articleが見つかりました。これは、Microsoft Service Trace Viewerのトレースログを調べるときに便利です。アクティビティをクリックすると、その特定のアクションで何が起きているのかを確認できるからです。同時スレッドによるアクションのトレース

Guid traceID = Guid.NewGuid(); 
ts.TraceTransfer(0, "transfer", traceID); 
Trace.CorrelationManager.ActivityId = traceID; // Trace is static 
ts.TraceEvent(TraceEventType.Start, 0, "Add request"); 

問題は次のとおりです:

は、ここでは、アクションにいくつかのトレースイベントを割り当てる方法の記事からのコード例だCorrelationManagerは静的であるため、アプリケーション全体に影響を与えます。マルチスレッドアプリケーションではどうしますか? 残念ながら、私は複数の並行活動を達成する方法が見つけられませんでした。 ありがとうございます!

答えて

4

トレースは静的です。ただし、CorrelationManagerはActivityIdとLogicalOperationStackをスレッドローカルストレージの形式で格納します。 CorrelationManagerはCallContext.LogicalSetDataを使用してCallContextに値を格納します。

これは、各スレッドが独自のActivityIdとLogicalOperationStackを持つことができることを意味します。

擬似コードでTrace.CorrelationManagerとCorrelationManager.ActivityIdのための実装はこのようなものになります。あなたが見ることができるように

public static class Trace 
{ 
    private static correlationManager = null; 
    public CorrelationManager CorrelationManager 
    { 
    get 
    { 
     if (correlationManager == null) correlationManager = new CorrelationManager(); 
     return correlationManager; 
    } 
    } 
} 


public class CorrelationManager 
{ 
    public Guid ActivityId 
    { 
    get 
    { 
     object id = CallContext.LogicalGetData("CorelationManager.ActivityId"); 
     if (id == null) 
     { 
     return Guid.Empty; 
     } 
     return (Guid) id; 
    } 
    set 
    { 
     CallContext.LogicalSetData("CorrelationManager.ActivityId", value); 
    } 
    } 
} 

を(それが静的であるため)、一つだけトレース「オブジェクト」があるとそこにありますCorrelationManagerは1つだけです(Traceオブジェクトのプロパティ、実際のオブジェクトインスタンスなので)。コンテキストデータのスレッドごとのインスタンス化(ActivityIdおよびLogicalOperationStack)は、CallContextオブジェクトを介して実現されます。

CallContext.LogicalSetDataで格納されたデータも、下流のスレッドに「フロー」します。そのため、ActivityIdをスレッドの先頭に設定し、その後そのスレッドがスレッド(他のスレッドを生成する可能性があります)を生成すると、それらのすべての下流スレッドは同じActivityIdを持ちます。

あなたがここにトレースし、CorrelationManagerのソースを見ることができます

(これはからですが、私はそれが今日どのようにトレースし、CorrelationManager作業にかなり近いと思われる。ネットのバージョンがわからない:

Trace

CorrelationManager

+0

驚くほど簡単:感謝oは – nepa

+2

うーん、それにいくつかの問題がある - 私たちは、MVCアプリケーションでTrace.CorrelationManager.ActivityIdを試してみましたが、我々は複数の並列Web要求を開始するまで、それがうまく働いた - そして、突然に行ってきました時々のActivityID '00000000-0000-0 000-0000-000000000000 'となります。何か壊れているようです。たぶん、私たち自身のActivityIdをHttpContextに格納しなければならないかもしれませんが、それが役立つかどうかはわかりません。 – JustAMartin

関連する問題