Ich habe eine Datei mit einem Basispfad zu allen meinen Ressourcen. Zum Beispiel:Wird Code eine Race Condition produzieren?
build/scripts/script1.js
build/scripts/script2.js
ich natürlich brauche einen Basispfad zum Beispiel:
https://example.org/SuperDuperSite/build/scripts/script1.js
Was ich habe gehofft, dass die Datei in ein globales Wörterbuch mit dem Pfad beim Start zu tun war, zu laden. Das Wörterbuch müsste nur einmal geladen werden. Leider, soweit ich das beurteilen kann, ist der Basispfad erst bei der ersten Anfrage verfügbar. Also in asp.net muss ich application_beginrequest
statt application_start
verwenden. Was daran schlimm ist, ist jetzt, dass ich mich mit Multithreading-Problemen befassen muss.
, die mich zwingt, die folgende Art von Code zu schreiben:
lock(_lock) {
if (_dictionary == null) {
LoadDictionary();
}
}
Diese für jede einzelne Anforderung aufgerufen werden würde, wenn ich nur wirklich einmal brauchen zu laden. Das mag ich natürlich nicht. Ich möchte nicht jede einzelne Anforderung aus Leistungsgründen sperren müssen. Eine Lösung, die nach dem Gespräch mit Hochschulen, die wir kamen mit:
if (_dictionary == null)
{
lock(_lock) {
if (_dictionary == null) {
LoadDictionary();
}
}
}
Also mit dieser Lösung würde ich nicht jede einzelne Anfrage zu erfassen erforderlich sein, aber wenn mehrere Threads am Ende immer diesen Abschnitt beim Start würde ich dann schützen Überprüfen Sie, ob das Objekt innerhalb der Sperre wieder null ist. Wird dieser Code funktionieren oder werde ich in einen Wettlauf geraten?
Klingt wie eine Menge Komplexität, um eine Basis-URL aufzunehmen. Gibt es einen Grund, warum Sie beim Start den Pfad in ein Wörterbuch geladen haben? –
Sind Sie sicher, dass Sie dies aus dem richtigen Winkel angreifen? Gibt es einen Grund, warum Sie keine relativen Pfadanforderungen ausführen können? –
Doppelt überprüfte Verriegelung ist in C# sicher.Bedingungen im Codebeispiel sind rückwärts, aber andere in Ordnung. –