2012-04-07 21 views
0

Eine Menge Code wurde gelöscht, aber ich muss wirklich nur diesen Teil zeigen. Die Grundidee: Methode Localize() muss schnell arbeiten, so dass es nicht von einem anderen Thread gesperrt werden muss. Es verwendet Flag isLoaded zu erkennen, welche Art von Lokalisierung zu verwenden - Old oder Current.Ist dieser Code Thread sicher? C#

static class Localization 
{ 
    static readonly object locker = new object(); 

    static string LocalizationDir; 

    static bool isLoaded; 
    static Tuple<string, string> OldLanguage; 
    static Dictionary<string, string> OldLocalization; 
    static Dictionary<string, string> CurrentLocalization; 

    public static Tuple<string, string> CurrentLanguage { 
     get; 
     private set; 
    } 

    static Localization() { 
     lock (locker) { 
      OldLanguage = null; 
      CurrentLanguage = new Tuple<string, string>("en", "English"); 
      isLoaded = true; 

      OldLocalization = null; 
      CurrentLocalization = null; 
     } 
    } 

    public static bool SetLanguage(string languageShortName) { 
     lock (locker) { 
      string languagePath = Path.Combine(LocalizationDir, languageShortName + ".loc"); 

      // save localization, be ready to return it back 
      OldLocalization = CurrentLocalization; 
      OldLanguage = CurrentLanguage; 
      isLoaded = false; 

      try { 
       using (TextReader i = new StreamReader(languagePath)) { 
        /* 
         Parse file, 
         Modify CurrentLocalization, CurrentLocalization 
        */ 
       } 
      } 
      catch (Exception e) { 
       // Just return back our good localization data 

       CurrentLocalization = OldLocalization; 
       CurrentLanguage = OldLanguage; 
       isLoaded = true; 

       OldLocalization = null; 
       OldLanguage = null; 

       return false; 
      } 

      // everything is good 
      { 
       OldLocalization = null; 
       OldLanguage = null; 
       isLoaded = true; 

       UpdateControls(); 
      } 

      return true; 
     } 
    } 


    // <summary> 
    // We think that there are no bugs in this method 
    // No locking 
    // </summary> 
    public static string Localize(this string Text) { 
     if (CurrentLanguage.Item2 == "English") 
      return Text; 

     Dictionary<string, string> ChoosedLocalization = null; 
     if (!isLoaded && OldLocalization != null) 
      ChoosedLocalization = OldLocalization; 
     else if (isLoaded && CurrentLocalization != null) 
      ChoosedLocalization = CurrentLocalization; 

     if (ChoosedLocalization != null) { 
      string Translate; 

      if (!ChoosedLocalization.TryGetValue(Text, out Translate)) 
       return Text; 
      else 
       return Translate; 
     } 
     else 
      return Text; 
    } 
} 
+0

Was verhindert, dass sich 'CurrentLanguage' während' Localize' ändert? –

+0

Oh, nichts. Ich muss das neu schreiben, wie ich mit CurrentLocalization geschrieben habe –

+0

Muss ich sperren, wenn ich schreibe 'ChoosedLocalization = OldLocalization; ChoosedLanguage = OldLanguage; 'in' if (! IsLoaded && OldLocalization! = Null) '? –

Antwort

2

Ich vermute, dass es nicht ist. Ich vermute auch, dass Sie Dinge überdenken. In SetLanguage sollten Sie nur das neue Wörterbuch laden und dann für das alte austauschen. Diese Zuweisung ist unteilbar, so lange Ihr Übersetzungscode CurrentLanguage nicht zweimal hintereinander verwendet und davon ausgeht, dass es derselbe ist und der UpdateControls-Aufruf wartet, bis ein vorheriger Aufruf (oder eine andere Racebedingungsverhinderung) erfolgt ist sollte einfacher, sauberer und zuverlässiger sein.