此代码线程安全吗?C#.

本文关键字:安全 代码 线程 | 更新日期: 2023-09-27 18:30:17

很多

代码被删除了,但我真的只需要显示这部分。主要思想:方法 Localize() 必须快速工作,因此它不能被任何其他线程锁定。它使用标志 isLoaded 来检测要使用的本地化类型 - 旧或当前。

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;
    }
} 

此代码线程安全吗?C#.

我怀疑不是。我也怀疑你想多了。在 SetLanguage 中,您应该做的只是加载新字典,然后将其换成旧字典。该赋值是原子的,因此只要您的翻译代码没有连续两次使用 CurrentLanguage,并假设它是相同的,并且 UpdateControls 调用会等到上一个调用完成(或其他一些争用条件预防),那么它应该更简单、更干净、更可靠。