0

定期的に 4 つの異なるメソッドを実行する Windows サービスがあります。これらのメソッドをログに記録するために log4net を使用しています。

4 つの異なる方法は、同じ他の方法をいくつか使用して仕事をします。

私の問題は、ロギングで、特定の時点で 4 つのメソッドのどれが実際に他のメソッドの 1 つを使用しているかを知る必要があることです。

この問題の解決策の 1 つは、メソッドが使用している他のメソッドに、特定の時間にどのメソッドが他のメソッドを使用しているかを示す追加のパラメーターを装備することです。

しかし、これを達成する別の方法があるかどうか疑問に思っていましたか? 特定の時点で、4 つのメソッドのうちどれが他のメソッドを使用しているかをログに記録できますか?

どのメソッドが外部メソッドの呼び出しを開始したかを知るために、すべてのメソッドにこの追加のパラメーターを装備するのは少し不器用に思えます。

ワークフローが次のような場合があるため、シナリオはもう少し複雑です。

Windows サービス メソッドが別のメソッドを呼び出します。次に、この別のメソッドが別のメソッドを呼び出し、別のメソッドが再び別のメソッドを呼び出します。どの Windows サービス メソッドが呼び出しを開始したかを追跡できる必要があります。

そのため、タスクはメカニズムを実装して、どの Windows サービス メソッドがメソッド呼び出しを開始したかを知ることです。

何か案が?明らかなものとは別に、すべてのメソッドに追加のパラメーターを装備して、呼び出し元の Windows サービス メソッドを渡すには?

4

3 に答える 3

1

あなたが質問を修正したので、私は答えを修正しました:

最もクリーンな方法は、コンテキストを作成することです。

public class Context: IDisposable
{
    [ThreadStatic]
    static private Context _Current;

    static public Context Current
    {
        get
        {
            return _Current;
        }
    }

    private readonly Context _Previous;

    public Context(string id)
    {
        ID = id;
        _Previous = _Current;
        _Current = this;
    }

    public string ID
    {
        get;
        private set;
    }

    public void Dispose()
    {
        _Current = _Previous;
    }
}

コンテキストを作成することで、この Context をmarkメソッドに使用できます。このコンテキストは、コードの別の部分で取得できます。

static void MethodA()
{
    using (new Context("A"))
    {
        SharedMethod();
    }
}

static void MethodB()
{
    using (new Context("B"))
    {
        SharedMethod();
    }
}

static void SharedMethod()
{
    Console.WriteLine(Context.Current.ID);
}

この例では、共有メソッドを呼び出す 2 つの異なるメソッドのみを示しましたが、これを 4 つに変換できると思います。

于 2013-05-19T19:19:40.120 に答える
1

これら 4 つのプロセスのコードを変更できないと仮定すると (変更できる場合は、プロセスのコードにログ ステートメントを配置するだけで済みます)、System.Diagnostics.StackTrace外部メソッドでクラスを使用できます。次に、そのスタック トレース オブジェクトで GetFrames メソッドを使用すると、コード内のそのポイントのコール スタックが得られます。

StackTrace t = new StackTrace();
StackFrame[] stackFrames = t.GetFrames();

例については、これを確認してください

于 2013-05-19T19:19:52.037 に答える
0

この情報が常に必要な場合は、既に提案したことを実行することをお勧めします。問題をデバッグしたいだけで、 を知る必要があるwho called who when場合は、Process Explorer を使用して簡単にその情報を取得できます。

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

http://blogs.msdn.com/b/vijaysk/archive/2009/04/02/getting-better-stack-traces-in-process-monitor-process-explorer.aspx

于 2013-05-19T19:19:06.677 に答える