Vorsicht bei String als Lock-Objekt

by Oliver 20. March 2010 14:59

Wenn man denn unbedingt einen String als Lock-Objekt nutzen will und man sich davon überzeugt hat, nicht den Type eines gerade durch die Methode schwirrenden Objektes zu nutzen (das könnte ja jeder machen ;-)), dann sollte man auf jeden Fall an String.Intern(myLockString) denken! Wo man kann, sollte man also weiterhin einen einfachen object-Lock nutzen: 1: private static readonly object _lock = new object(); Aber man darf dann nicht vergessen, dass alle Threads, die auf den Code im Lock zugreifen von einem einzigen Lock bedient werden. Wenn man die Threads aber in Gruppen aufteilen kann, die unabhängig voneinander arbeiten können, ist diese Beschränkung zu scharf. Ich suchte also einen Weg, einen eindeutigen Lock für jede dieser Gruppen (hier: TranslationGroup) zu generieren, der von allen Instanzen geteilt wird. Der Gruppenidentifikator heißt hier _pageNameKey. Beispiel: 1: private const string _migrateLock = "9B90360AAF4342798A739DA2D85AF5AF"; // guid 2:  3: private string _pageNameKey = ...; // can be the same in multiple parallel threads 4:  5: public void Migrate(string oldGroupName, Dictionary<string, string> controlIdsOldToNew) 6: { 7: lock (string.Intern(_migrateLock + _pageNameKey)) 8: { 9: // do something not here that should not be done in parallel 10: } 11: } Ließe man in Zeile 7 das String.Intern(…) weg, würde bei jedem Aufruf der Methode ein neues String-Objekt generiert – was für dem Lock seine Existenzberechtigung raubt. Gruß, Oliver Technorati-Tags: Multithreading,Lock,String,Intern

Pfad der aktuellen Assembly

by robert 23. December 2009 02:59

In welchem Pfad befindet sich die aktuell verwendete Assembly? Bisher dachte ich immer AppDomain.CurrentDomain.BaseDirectory wäre ein verlässlicher Weg dies herauszufinden. Stimmt aber nicht, den dieser Pfad kann natürlich auch gesetzt werden, was zu unerwarteten Ergebnissen mit unterschiedlichen Test-Runnern führte ("R#" und der "Nunit GUI"). Der richtige Weg: Assembly.GetExecutingAssembly().CodeBase, das den ursprünglichen Speicherort der Assembly zurück gibt.

enjoyed the post?

Tags:

.NET

Enum / Flags einfach und sicher definieren

by Oliver 13. November 2009 22:33

Hier (http://blogs.msdn.com/kcwalina/archive/2004/05/18/134208.aspx#5943757) habe ich eine Methode gefunden, wie man einfach und ohne Mathekenntnisse (für einige von uns ;-)) Flag-Enums definiert: .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } enum Color { None = 0, Blue = 1 << 0, Red = 1 << 1, Yellow = 1 << 2, Purple = Blue | Red, Orange = Red | Yellow, } Oliver

32-bit DLL in 64-bit WebApp: An attempt was made to load a program with an incorrect format

by Oliver 30. October 2009 16:36

Die folgende Fehlermeldung erhielt ich heute von unserem IIS7, als ich Camping.Info starten wollte: Server Error in '/' Application. Could not load file or assembly 'Microsoft.Cci' or one of its dependencies. An attempt was made to load a program with an incorrect format. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.BadImageFormatException: Could not load file or assembly 'Microsoft.Cci' or one of its dependencies. An attempt was made to load a program with an incorrect format. Also das Orakel gefragt und u.a. das hier gefunden: http://forums.asp.net/t/1358032.aspx Standardmäßig unterstützt ein 64-bittiger IIS 7 keine 32-bit-Module (u.a. DLLs). Man kann es ihm aber einfach beibringen :-) Im IIS-Manager den gewünschten ApplicationPool auswählen und in den Advanced Settings die folgende Einstellung vornehmen: Der Vollständigkeit halber hier noch ein Link zur Anleitung für den IIS6 auf Windows 2003 Server: http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/405f5bb5-87a3-43d2-8138-54b75db73aa1.mspx?mfr=true Happy Coding! Oliver

Mscorcfg.msc beziehen

by robert 22. September 2009 00:29

Das .NET Framework-Konfigurationstool (Mscorcfg.msc) ist seit .NET 2.0 nicht mehr Teil des .NET "Redistributable", sondern nur noch Teil des .NET SKDs. 354MB SDK für ein kleines Tool dass Sicherheitseinstellungen grafisch bearbeiten lässt scheint ein wenig viel. Hier findet sich eine alternative in Form eines inoffiziellen Installers. Auf Kommandozeilenebenen hilft caspol.exe (CAS-Policies), das in C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 zu finden ist. Links: Über caspool.exe auf der deutschen MSDN Über Mscorcfg.msc auf der englischen MSDN Download .NET SDK 2.0 Schnelle Installation 1: Installer für “configuration tools”. Schnelle Installation 2: Installation von MSCORCFG.MSC auf einem normalen PC

enjoyed the post?

Tags:

.NET

Standard-Email Programm öffnen c# & mailto:

by robert 4. June 2009 13:21

Folgender Code öffnet den “Default-Email-Client”: System.Diagnostics.Process.Start( String.Format("mailto:{0}?subject={1}&body={2}", "demo@mail.de", "Nachricht von test@test.de", "Hallo %0aNachricht %0aGrußformel"));   “%0a” erzeugt einen Zeilenumbruch.     Attachments werden nicht konsistent interpretiert und sind Email-Client Versions und Patch abhängig. “Attach” wird von Outlook 2007 aus Sicherheitsgründen nicht weiter unterstützt. Werden Attachments verbindlich benötigt ist man mit dem direkten Versand der Email auf der sicheren Seite.

Ids verketten mit CHAR-Delimiter

by Oliver 10. April 2009 18:55

Ein kleiner Fallstrick im alltäglichen Programmierleben: Wir benötigen eine Liste von Int's als String, um flexibel zu sein mit veränderbarem Trennzeichen, bevorzugt ein char. Das Ergebnis überrascht:   Natürlich muss es wie folgt heißen:   Gruß, Oliver P.S. Screenshots made by Greenshot (ein funktionsreiches Open-Source-Screenshot-Tool: http://sourceforge.net/projects/greenshot/). UPDATE: Natürlich das noch  d e u t l i c h  einfacher:   Danke, .NET :-)

Tagging

by Stefan 29. September 2008 03:54

Ich habe gerade im IRC mit jemandem gesprochen, der ein gutes Programm zum Verwalten von Bildern suchte. Der letze der mich nach sowas fragte war mein Vater vor einigen Jahren, noch bevor es Google Picasa gab. Ich erinnerte mich an das Programm, dass ich damals geschrieben hatte. Leider wurde es nie ganz fertig - zum einfachen Verwalten und Betrachten taugte es aber und ich benutzte es sogar selber, da es im Gegensatz zur Betriebssystemeigenen Bildvorschau von XP prima mit vielen Dateien umgehen konnte.Während ich soeben feststellte dass meine alte Backup-DVD korrupt ist fiel mir was ein: Wir arbeiten doch gerade unter anderem an Tagging! Wie konnte ich das nur vergessen? All die Stunden die ich damals verbracht habe, um herauszufinden, was an gewöhnlichem Tagging besonders bei großen Datenmengen so nervig ist.. Sobald ich kann, werde ich unsere Tagging-Bibliothek fertigschreiben - mit all den Lösungen, die ich mir damals ausgedacht habe. Seid also gespannt ;-)

Interface naming convention

by admin 5. June 2008 23:31

"I" als Praefix - das ist Geschmacksfrage und soll nicht Thema sein. Folgendes hat mich schmunzeln lassen: A couple of programmers on our team learned that interface names should begin with "I", but didn't pick up on the rest of the guidelines. So they treated "I" as a personal pronoun, not as an acronym. We now have interface names like "IAmAChildObject", "INeedMyDataRow", "IAmDependentAndWantMyParentCollection", and "ICanDeleteMyself". [via Brad Abrams (in den Kommentaren)]

enjoyed the post?

Tags:

.NET

Debugging von First Chance Exceptions

by admin 23. April 2008 01:16

Beim Debuggen finden sich von Zeit zu Zeit sogenannte "First chance exceptions" im Output Window. Das sind Exceptions die von der Anwendung gehandelt wurden. Oft ist es gewollt oder normal, das eine Exeption erwartet wird und von der Anwendung bearbeitet wird. Beispiel: Ein fehlgeschlagenen Datenbankzugriff. (Ob das grundsätzlich guter Stil ist, ist wie so vieles eine Geschmackfrage.) Der Name kommt daher das der Debugger die Exception 2 Mal sieht. Das erste Mal vor der Anwendung (first chance exception) und das zweite Mal, wenn die Anwendung die Exception nicht verarbeitet hat - also das Programm normalerweise abstürzen würde (second chance excpetion). Weil Exeption Handling Performance intensiv ist oder einfach weil einem die im Output Fenster angezeigten Fehlermeldungen komischem vorkommen, kann es wünschenswert sein schon beim Auftreten einer "first chance exception" in den Code zu springen. Das ist einfach erreichen, in dem unter Debug->Exceptions->CLR -Exceptions antickt. Genug von Ausnahmen, happy coding!

enjoyed the post?

Tags:

.NET

About Oliver

shades-of-orange.com code blog logo I build web applications using ASP.NET and have a passion for javascript. Enjoy MVC and Orchard CMS, and I do TDD whenever I can. I like clean code. Love to spend time with my wife and our three children. My profile on Stack Exchange, a network of free, community-driven Q&A sites

About Anton

shades-of-orange.com code blog logo I'm a software developer at teamaton. I code in C# and work with MVC, Orchard, SpecFlow, Coypu and NHibernate. I enjoy beach volleyball, board games and Coke.