不同的方法是利用相同的其他方法.如何知道哪个方法当前正在使用这些其他方法之一

本文关键字:方法 其他 何知道 | 更新日期: 2023-09-27 18:14:16

我有一个Windows服务,它定期运行4种不同的方法。我使用log4net来记录这些方法。

这4种不同的方法使用一些相同的其他方法来完成它们的工作。

我的问题是,在日志记录中,我需要知道在给定的时间,这4种方法中的哪一种实际上使用了其他方法中的一种。

这个问题的一个解决方案是为正在使用的其他方法配备一个额外的参数,告诉哪个方法在给定的时间正在使用另一个方法。

但我只是想知道是否有另一种方法来完成这个?能够记录我的4个方法中哪一个在给定的时间使用另一个方法?

为我的所有方法配备这个额外的参数,以便知道我的哪个方法发起了对外部方法的调用,这似乎有点笨拙。

这个场景也有点复杂,因为有时工作流是:

我的Windows服务方法调用另一个方法。然后这个方法调用另一个方法,这个方法再调用另一个方法,以此类推。

我需要能够跟踪我的Windows服务的方法发起调用。

所以任务是实现一种机制,这样我就可以知道哪个Windows服务方法发起了方法调用

任何想法?除了明显的一个:装备所有的方法与一个额外的参数传递哪一个我的Windows服务方法发起调用?

不同的方法是利用相同的其他方法.如何知道哪个方法当前正在使用这些其他方法之一

既然你修改了问题,我就修改了答案:

最干净的方法是创建一个上下文:

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

您可以通过创建上下文来使用此上下文来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);
}

在这个例子中,我只展示了两个不同的方法调用一个共享方法,但我认为你可以把它转换成四个。

假设您不能修改这四个进程的代码(如果可以,那么只需将日志记录语句放在这些进程的代码中),您可以在外部方法中使用System.Diagnostics.StackTrace类。然后,在堆栈跟踪对象上使用GetFrames方法将为您提供代码中该点的调用堆栈。

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

举个例子。

如果您总是想要这些信息,最好的办法是按照您已经建议的去做。现在,如果您只是想调试问题并需要知道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