.net - 新的 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 值都搞砸了。
知道这里出了什么问题吗?