2012-04-07 4 views
0

많은 코드가 삭제되었지만이 부분 만 표시해야합니다. 주요 아이디어 : 방법 로컬 화()은 신속하게 작동해야하므로 다른 스레드가 잠글 수 없습니다. isLoaded 플래그를 사용하여 사용할 현지화 유형 (Old 또는 Current)을 감지합니다.이 코드는 안전한 스레드입니까? 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

'Localize '중에'CurrentLanguage'가 변경되는 것을 어떻게 막을 수 있습니까? –

+0

오, 아무것도. 나는 CurrentLocalization으로 writed처럼 그것을 다시 써야만한다. –

+0

'ChoosedLocalization = OldLocalization; ChoosedLanguage = OldLanguage;'if (! isLoaded && OldLocalization! = null)'? –

답변

2

나는 그렇지 않다고 생각합니다. 나는 또한 당신이 사기성이 있다고 생각합니다. SetLanguage에서, 당신은 새로운 사전을로드하고 옛날에 그것을 대체해야한다. 이 할당은 원자 적입니다. 따라서 Translate 코드가 CurrentLanguage를 두 번 연속 사용하지 않는 한 동일한 호출이고 이전 호출 (또는 다른 경쟁 조건 방지)이 완료 될 때까지 UpdateControls 호출이 대기한다고 가정하면 더 간단하고, 청결하며, 신뢰할 수 있어야합니다.

관련 문제