我应该如何处理内部字典的线程更新,可能是在thread.delegate退出之后?

时间:2011-01-19 02:46:58

标签: c# .net multithreading locking threadpool

我有N个线程,每个线程都将数据保存到具有实例对象范围的private Dictionary<string,myObject> myUploadObject变量。

一旦该字典中有足够的数据,或者经过2分钟后,我就会将该集合上传到服务器。

我从未遇到过这种多线程情况,也不确定如何处理这种情况。以下是我启动初始代码的方法:

        PerfmonClient agent = new PerfmonClient(Machine, Start, Stop, Interval, MaxIterations);
        Thread newThread = null;
        Console.WriteLine("Creating new thread: " + agent.ToThreadName());
        ThreadStart threadDelegate = new ThreadStart(agent.TestLoop);
        newThread = new Thread(threadDelegate);
        agent.AssociatedThread = newThread;
        AgentDictionary.Add(agent.ToThreadName(), agent);
        newThread.Start();

现在我正在尝试从agent对象中获取数据并将其发送到服务器。我通常会在PerfmonClient的实例中调用另一个方法来执行此操作,但线程概念让我仔细检查我的方法。

以下是我正在考虑采集收集的数据并将其发送到服务器的一些方法:

  • agent.upload方法创建一个新的ThreadDelegate,加载并运行它(主线程或生成的线程)

  • 将内部对象Dictionary<string,myObject> myUploadObject更改为public和static,并使用threadDelegate / Main线程进行上传。

  • ??不确定如果初始agent.TestLoop退出或出错会发生什么?我是否丢失了agent对象中的所有数据?如何在thread.IsActive == false?

  • 时访问内部数据

感谢您回答这些问题......或指点我正确的方向。我不确定我是否在这里重新发明轮子,可能需要学习新的东西。

1 个答案:

答案 0 :(得分:1)

我会有一个中央上传器线程,它提供一个方法AddPerformanceData来添加集合线程可以调用的性能数据。此方法使用锁并在内部存储数据。然后上传者线程也会使用锁访问顺序发送数据。

这样做的好处是,您不需要对集合线程进行任何锁定,因为没有其他人正在访问他们的数据 - 您基本上是通过上传器线程序列化上传。