如何解决新的 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 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 值全乱了。
知道这里出了什么问题吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。