我有一个Windows服务,它定期运行4种不同的方法。 我正在使用log4net来记录这些方法。
4种不同的方法使用一些相同的其他方法来完成它们的工作。
我的问题是在日志记录中我需要知道4种方法中的哪一种实际上在给定时间使用了其他方法之一。
这个问题的一个解决方案是为方法正在使用的其他方法配备一个额外的参数,告诉哪个方法在给定时间使用另一个方法。
但我只是想知道是否还有另一种方法可以实现这一目标?能够记录我的4种方法中哪一种在给定时间使用其他方法?
为了知道我的哪些方法产生了对外部方法的调用,为我的所有方法装备这个额外的参数似乎有点笨拙。
场景也有点复杂,因为有时工作流程是:
我的Windows服务方法调用另一种方法。 然后这个方法调用另一个方法,再次调用另一个方法,等等。 我需要能够跟踪哪些Windows服务方法发起了呼叫。
所以任务是实现一种机制,这样我就可以知道哪些Windows服务方法产生了方法调用。
有什么想法吗?除了显而易见的一个:为所有方法配备一个额外的参数来传递我的哪些Windows服务方法产生了这个调用?
答案 0 :(得分: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;
}
}
您可以通过创建上下文将此上下文用于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);
}
在这个例子中,我只展示了两种调用共享方法的不同方法,但我认为你可以把它翻译成四种。
答案 1 :(得分:1)
假设您无法修改这四个进程的代码(如果可以,那么将日志语句放入进程的代码中就很简单了),您可以在外部方法中使用System.Diagnostics.StackTrace
类。然后在该堆栈跟踪对象上使用GetFrames方法将为您提供代码中该点的调用堆栈。
StackTrace t = new StackTrace();
StackFrame[] stackFrames = t.GetFrames();
例如check this。
答案 2 :(得分:0)
如果您一直想要这些信息,最好的办法就是按照您的建议行事。
现在,如果您只想调试问题并需要知道who called who when
,那么您可以使用Process Explorer轻松获取该信息:
http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx