Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET:是一个列表<;T>;在不添加或删除任何项目的情况下修改其项目时线程安全?_C#_.net - Fatal编程技术网

C# .NET:是一个列表<;T>;在不添加或删除任何项目的情况下修改其项目时线程安全?

C# .NET:是一个列表<;T>;在不添加或删除任何项目的情况下修改其项目时线程安全?,c#,.net,C#,.net,关于线程安全和列表,有很多问题和答案,但我没有找到一个答案来回答我的问题。我知道列表通常不是线程安全的,在.NET>4中有线程安全的替代方案,比如ConcurrentBag。然而,当列表仅从中读取时,它是线程安全的 不过,我想知道更改列表项的字段是否是线程安全的?我没有从列表中添加或删除任何内容,而且线程和项之间存在1:1的关系,因此一个项只能由一个线程访问 类似这样的东西(只是一个例子) 类项目 { 字符串错误消息; 智力状态; 列表列表; 公共静态异步任务modifyList() { 列表列

关于线程安全和列表,有很多问题和答案,但我没有找到一个答案来回答我的问题。我知道列表通常不是线程安全的,在.NET>4中有线程安全的替代方案,比如ConcurrentBag。然而,当列表仅从中读取时,它是线程安全的

不过,我想知道更改列表项的字段是否是线程安全的?我没有从列表中添加或删除任何内容,而且线程和项之间存在1:1的关系,因此一个项只能由一个线程访问

类似这样的东西(只是一个例子)

类项目
{
字符串错误消息;
智力状态;
列表列表;
公共静态异步任务modifyList()
{
列表列表=新列表(){new Item(),new Item(),new Item()};
foreach(列表中的项目)
{
Task.Run(async()=>{item.ErrorMessage=“Some error”;item.Status=-1;item.Stringlist.Add(“Some text”);});
}
}
}

一个
项目
不知道其引用(至少一个)已存储在列表中。列表只包含引用,而不是对象本身

当您使用
变量时,它包含对
的引用,并且不知道该引用是从
列表
复制的

因此,在执行
item.ErrorMessage=
时,您有一个引用和一个对象,这两个对象都不知道到达该点涉及到
列表


该访问与
对象一样是线程安全的,并且您能够推理线程如何与其
ErrorMessage
属性交互。

这样它是线程安全的-您不会更改列表。任何读-修改-写操作在多个线程未同步时都是不安全的。无论是在列表上还是在列表项上,这都无关紧要。为了提高我的问题的质量,我试图弄清楚为什么这个问题被关闭了。根据“要询问的主题”,涵盖“软件开发特有的实用、可回答的问题”的问题是可以接受的。因此,一个关于概念是否线程安全的简单问题应该非常好,即使没有任何调试信息,甚至没有我提供的示例作为说明。对于如何更好地提出这样一个问题的建议,我们深表感谢。@Aileron79没有人能告诉您未显示的代码是否能在多线程环境中正常工作。说应该有人能够在看不见的情况下告诉您代码是否正确是没有意义的。有人可以猜测您是如何实现它的,以及它是否正确,但这并不是为人们必须猜测答案的问题而设计的。有人告诉你你的代码是安全的,但他们不知道并不意味着它实际上是安全的。相反,他们只是给了你一种虚假的安全感。认为某事是正确的,而事实并非如此,这比不知道要糟糕得多。这一点我是理解的。尽管如此,我相信通过描述环境条件,我已经提供了足够的信息来可靠地回答这个问题。我还没有任何工作代码,这就是为什么我问这个问题@不信者达米恩不仅给出了“是”的回答,而且还解释说列表中只包含参考资料。这是一个我可以做出决定的答案,这正是我所期望的。否则我该如何措辞才能得到准确的答案?只是问一下,因为我想下次用正确的方式做。谢谢,这正是我需要知道的。我真的不明白为什么问题以“这个问题需要调试细节”结束,我没有什么需要调试的!这只是一个关于概念的问题,我只是想要一个像你提供的答案一样的是或否的答案。
class Item
{
    string ErrorMessage;
    int Status;
    List<string> Stringlist;

    public static async Task modifyList()
    {
        List<Item> list = new List<Item>(){new Item(), new Item(), new Item() };

        foreach (Item item in list)
        {
            Task.Run(async () => { item.ErrorMessage = "Some error"; item.Status = -1; item.Stringlist.Add("Some text"); });
        }
    }
}