C# 我的收藏线程安全吗?

C# 我的收藏线程安全吗?,c#,C#,AddSafe方法是真正的线程安全的还是我所做的是错误的 public static MyCollection myCol = new MyCollection(); class MyCollection: ObservableCollection<string> { public void AddSafe(string item) { lock(this) { this.Add(item);

AddSafe方法是真正的线程安全的还是我所做的是错误的

public static MyCollection myCol = new MyCollection();

class MyCollection: ObservableCollection<string>
{
    public void AddSafe(string item)
    {
        lock(this)
        {
            this.Add(item);
        }
    }
}
publicstaticmycollection myCol=newmycollection();
类别MyCollection:ObservableCollection
{
公共void AddSafe(字符串项)
{
锁(这个)
{
本条增加(项目);
}
}
}

删除/访问如何,不仅仅是添加?但是阅读项目也应该被锁定


设计上有一个小问题:您使用的是一个主要由GUI使用的
可观察集合

我建议您不要在其他线程中使用
ObservableCollection
,而不要使用GUI线程。在gui线程以外的其他线程上触发时,“侦听”事件的控件将崩溃。更改ObservableCollection中的项时,应在Dispatcher上调用它。这样,您的收藏是线程安全的。(因为没有使用交叉线程)

public class MyControl: UserControl
{

    private void MyMethodCalledFromAnOtherThread()
    {
        this.Dispatcher.Invoke(new Action(
        {
            // Change the collection...
            myCol.Add("Hi there");
        });
    }

检查这个!从链接中查看罗伯特·弗雷泽的答案!是的,这不仅仅是关于添加,我只是一般性地问。我在单独的线程中读取套接字中的数据,所以我不能在GUI线程中执行此操作。您不应该从套接字线程写入observablecollection。使用
dispather.invoke
同步socker线程和gui线程。甚至更好。使用队列存储套接字线程排队的接收消息,并使用Dispatchermer处理队列。这样,套接字线程就不会推动gui线程。