【问题标题】:Why this lock statement doesn't work?为什么这个锁语句不起作用?
【发布时间】:2010-05-20 17:21:07
【问题描述】:

为什么这个锁测试不起作用?它在控制台下方抛出异常。写该集合已修改....

    static List<string> staticVar = new List<string>();

    static void Main(string[] args)
    {
        Action<IEnumerable<int>> assyncMethod = enumerator =>
                {
                    lock (staticVar)
                        foreach (int item in enumerator)
                            staticVar.Add(item.ToString());


                };

        assyncMethod.BeginInvoke(Enumerable.Range(0, 500000), null, null);
        Thread.Sleep(100);

        Console.Write(staticVar.Count());
        foreach (string item in staticVar)
        {

        }
    }

【问题讨论】:

    标签: c# multithreading locking


    【解决方案1】:

    为了使锁有效,必须在访问集合的所有情况下使用它。无论是阅读还是写作。所以必须在枚举集合之前加个锁

    例如

    lock (staticVar) {
        Console.Write(staticVar.Count());
        foreach (string item in staticVar) {
    
        }
    }
    

    【讨论】:

    • 只对集合还是所有类型?
    • 锁的要点是,如果锁在别处,则没有任何东西可以进入锁。如果锁不在其周围,则锁不会对代码块产生影响。锁必须包装使用同步变量的每一段代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多