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