我有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?
感谢您回答这些问题......或指点我正确的方向。我不确定我是否在这里重新发明轮子,可能需要学习新的东西。
答案 0 :(得分:1)
我会有一个中央上传器线程,它提供一个方法AddPerformanceData
来添加集合线程可以调用的性能数据。此方法使用锁并在内部存储数据。然后上传者线程也会使用锁访问顺序发送数据。
这样做的好处是,您不需要对集合线程进行任何锁定,因为没有其他人正在访问他们的数据 - 您基本上是通过上传器线程序列化上传。