【问题标题】:Is my collection thread safe?我的收藏线程安全吗?
【发布时间】:2016-12-02 11:27:00
【问题描述】:

AddSafe 方法真的是线程安全的还是我做错了?

public static MyCollection myCol = new MyCollection();

class MyCollection: ObservableCollection<string>
{
    public void AddSafe(string item)
    {
        lock(this)
        {
            this.Add(item);
        }
    }
}

【问题讨论】:

标签: c#


【解决方案1】:

删除/访问怎么样,不仅仅是添加?但是阅读项目也应该被锁定。


设计上有一个小问题:您使用的是ObservableCollection,它主要由 GUI 使用。

我建议您在其他线程不要使用ObservableCollection&lt;&gt;而不是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 线程。甚至更好。使用队列来存储接收到的由套接字线程排队的消息,并使用 DispatcherTimer 来处理队列。这样socket线程就不会推送gui线程了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2015-11-03
  • 1970-01-01
  • 2020-04-15
  • 2016-05-22
  • 2018-07-18
相关资源
最近更新 更多