Thanks for the explination. I have another question now. When using the ThreadContext.Stacks, what pattern conversion character do you use to read it? Is it stored in the properties collection? For example ...

using(ThreadContext.Stacks["OrderID"].Push(orderId))
{
 // The above message will be attached to the stack for all
 // nested method calls made here
}

would it be  ...

%P{OrderID}

or

%x{OrderID}

thank,
Paul


----- Original Message ----- From: "Nicko Cadell" <[EMAIL PROTECTED]>
To: "Log4NET User" <[email protected]>
Sent: Wednesday, November 24, 2004 9:45 AM
Subject: RE: LogicalThreadContext vs ThreadContext



Paul,

The ThreadContext stores data in a thread local slot. This is attached
to a specific runtime thread. In v1.0 and v1.1 this thread corresponds
to an OS thread. The ThreadContext data is limited to that one thread
and not visible from other threads.

The LogicalThreadContext stores its data in a CallContext slot.
For more info on CallContext see:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/h
tml/frlrfsystemruntimeremotingmessagingcallcontextclasstopic.asp
The CallContext data is essentially data stored local to the logical
thread. The logical thread can jump from one runtime thread to another.
Other than that the behaviour will be the same as for the ThreadContext.
In practice the LogicalThreadContext will behave nearly identically to
the ThreadContext because we do not allow our LogicalThreadContext data
to cross a remoting boundary (we do not implement the
ILogicalThreadAffinative interface). As far as I know the only places
where the LogicalThreadContext will transfer the data to another thread
is for asynchronous delegate invocations which might execute on a
different thread (but not ThreadPool.QueueUserWorkItem).

What is a CallContext, is that a method call?

No it is the logical thread of execution not the current method call.


I would expect the values I set in a method
using LogicalThreadContext to go out of scope when the
execution leaves that method but it does not.  Any ideas?

Values attached to the CallContext remain in scope during the rest of the execution of the logical thread.

If you want to set a value for the duration of a method call you should
use a ThreadContext stack:

// Push a message onto the stack for this
using(ThreadContext.Stacks["NDC"].Push("my context message"))
{
 // The above message will be attached to the stack for all
 // nested method calls made here
}
// at the end of the using block the message is automatically popped


Hope that helps,

Nicko


PS. For those wondering the ThreadContext and LogicalThreadContext are only available in the CVS version of the log4net code.

-----Original Message-----
From: Paul Welter [mailto:[EMAIL PROTECTED]
Sent: 23 November 2004 20:25
To: [email protected]
Subject: LogicalThreadContext vs ThreadContext

I'm a little confused as to the difference between
LogicalThreadContext and ThreadContext.  Can someone explain
the difference?  LogicalThreadContext says it is for
CallContext debugging.  What is a CallContext, is that a
method call?  I would expect the values I set in a method
using LogicalThreadContext to go out of scope when the
execution leaves that method but it does not.  Any ideas?

thanks
~ Paul




Reply via email to