Logiskt (i kontexten)

2015-01-28

Tappar du referenserna till dina objekt i System.Runtime.Remoting.Messaging.CallContext? I kod som körs på andra trådar måste du använda metoderna CallContext.LogicalGetData och CallContext.LogicalSetData istället för bara CallContext.GetData och CallContext.SetData. Logiskt.

Jag har fortfarande respekt för IoC-containers och använde länge Singeltons trots deras avigsdor. Nyligen hittade jag till System.Runtime.Remoting.Messaging.CallContext och allt har varit frid och fröjd under en tid.

Efter en refaktorisering tappade jag plötsligt alla värden i de här objekten. Mängder av NullReferenceExceptions. Jag trodde ett slag att jag min faiblesse för statiska metoder och objekt tagit ut sin tribut, men det visade sig snart att det var i kod som kördes i andra trådar som värdena försvann.

Tack vare frågan Why does LogicalCallContext not work with async? på Stackoverflow fick gåtan både sin förklaring och sin lösning.

Bara att ersätta

var user = (User)CallContext.GetData("CurrentUser");

med

var user = (User)CallContext.LogicalGetData("CurrentUser");

Enkelt.

/Bibliotekarien - The Librarian