首页 > 解决方案 > 新的 lambda 没有给出预期的结果

问题描述

在编写一个简短的测试应用程序时(请原谅我对类的愚蠢命名、肮脏的外壳等等),我偶然发现了这个问题:

在 lambda 中使用新语句会产生一些奇怪的结果,以下是代码和输出:

    class Program
{
    static void Main(string[] args)
    {
        ObjectToWrite obj = new ObjectToWrite() { MyString = "---" };

        ////This will work ok
        for (int i = 0; i < 5; i++)
        {
            var rwObj = new ObjectReaderWriter() { Name = $"writer{i}" };
            Thread t = new Thread(() => RW(rwObj, obj));
            t.Start();
        }

        //This will not work
        //for (int i = 0; i < 5; i++)
        //{
        //    Thread t = new Thread(() => RW(new ObjectReaderWriter() { Name = $"writer{i}" }, obj));
        //    t.Start();
        //}

        Console.ReadKey();
    }

    static void RW(ObjectReaderWriter rwObj, ObjectToWrite obj)
    {
        rwObj.ReadWrite(obj);
    }

    public class ObjectReaderWriter
    {
        public string Name { get; set; } = "hey";
        public void ReadWrite(ObjectToWrite obj)
        {
            for (int i = 0; i < 5; i++)
            {
                var str = $"{Name} count {i}";
                obj.MyString = str;
                Thread.Sleep(1);//let other thread write some data
                Console.WriteLine($"Written {str}, Read {obj.MyString}");
            }
        }
    }

    public class ObjectToWrite
    {
        private string _myString;

        private readonly object lockObject = new object();

        public string MyString
        {
            get
            {
                lock (lockObject)
                {
                    return _myString;
                }
            }
            set
            {
                lock (lockObject)
                {
                    _myString = value;
                }
            }
        }
    }
}

以及工作案例中的输出

Written writer1 count 0, Read writer2 count 0
Written writer0 count 0, Read writer2 count 0
Written writer4 count 0, Read writer0 count 1
Written writer2 count 0, Read writer0 count 1
Written writer3 count 0, Read writer2 count 0
Written writer1 count 1, Read writer3 count 1
Written writer0 count 1, Read writer3 count 1
Written writer3 count 1, Read writer0 count 2
Written writer2 count 1, Read writer0 count 2
Written writer4 count 1, Read writer0 count 2
Written writer0 count 2, Read writer4 count 2
Written writer1 count 2, Read writer4 count 2
Written writer2 count 2, Read writer1 count 3
Written writer4 count 2, Read writer1 count 3
Written writer3 count 2, Read writer1 count 3
Written writer1 count 3, Read writer3 count 3
Written writer0 count 3, Read writer3 count 3
Written writer4 count 3, Read writer0 count 4
Written writer2 count 3, Read writer0 count 4
Written writer3 count 3, Read writer0 count 4
Written writer0 count 4, Read writer3 count 4
Written writer1 count 4, Read writer3 count 4
Written writer4 count 4, Read writer3 count 4
Written writer2 count 4, Read writer3 count 4
Written writer3 count 4, Read writer3 count 4

现在第二种情况的输出:

Written writer3 count 0, Read writer3 count 0
Written writer3 count 1, Read writer3 count 1
Written writer4 count 0, Read writer3 count 2
Written writer2 count 0, Read writer4 count 0
Written writer4 count 1, Read writer4 count 1
Written writer3 count 2, Read writer4 count 1
Written writer4 count 2, Read writer3 count 3
Written writer5 count 0, Read writer3 count 3
Written writer3 count 3, Read writer5 count 1
Written writer2 count 1, Read writer3 count 3
Written writer5 count 0, Read writer3 count 3
Written writer5 count 1, Read writer5 count 1
Written writer4 count 3, Read writer5 count 1
Written writer5 count 1, Read writer4 count 4
Written writer3 count 4, Read writer4 count 4
Written writer2 count 2, Read writer4 count 4
Written writer4 count 4, Read writer5 count 2
Written writer5 count 2, Read writer2 count 3
Written writer5 count 2, Read writer5 count 2
Written writer5 count 3, Read writer5 count 3
Written writer2 count 3, Read writer5 count 3
Written writer5 count 4, Read writer2 count 4
Written writer5 count 3, Read writer2 count 4
Written writer2 count 4, Read writer5 count 4
Written writer5 count 4, Read writer5 count 4

线程的行为是正确的,但是当我在 lambda 中创建我的对象时:new ObjectReaderWriter() { Name = $"writer{i}" },i 值都搞砸了。

知道这里出了什么问题吗?

标签: .netvisual-studioc#-4.0

解决方案


推荐阅读