我有一个队列,它会超时接收数据。 我使用多线程出队并保存到数据库。 我创建了一个Thread of Thread来完成这项工作。
for (int i = 0; i < thr.Length; i++)
{
thr[i] = new Thread(new ThreadStart(SaveData));
thr[i].Start();
}
保存数据
注意:eQ和eiQ是2个全局队列。我用它来保持线程活着。
public void SaveData()
{
var imgDAO = new imageDAO ();
string exception = "";
try
{
while (eQ.Count > 0 && eiQ.Count > 0)
{
var newRecord = eQ.Dequeue();
var newRecordImage = eiQ.Dequeue();
imageDAO.SaveEvent(newEvent, newEventImage);
var storepath = Properties.Settings.Default.StorePath;
save.WriteFile(storepath, newEvent, newEventImage);
}
}
catch (Exception e)
{
Global._logger.Info(e.Message + e.Source);
}
}
它创建了多线程,但是当我调试时,只有1个线程处于活动状态,其余线程已经死亡。 我不知道为什么?有谁有想法? Tks
答案 0 :(得分:1)
您在该线程函数中使用WriteFile
。
这是否可能,您尝试编写可能被另一个线程(相同的文件名或其他内容)锁定的文件?
还有一件事 - 通过多个线程在磁盘上保存数据 - 我不喜欢它。
我认为你应该创建一些缓冲区而不是许多线程,并且每隔几条记录/条目写一次。
答案 1 :(得分:1)
正如评论中所提到的,只要队列中有元素,你的线程就会存在,因为两者都是空的,线程将终止。这可以解释为什么在调试时只能看到一个活动线程。
您的问题的一个潜在答案是使用System.Collections.Concurrent类中的BlockingCollection而不是Queue。它具有阻塞出队的能力,这将阻止线程直到更多元素可用于处理。
另一个问题是 eQ 和 eiQ 之间的良好竞争条件 - 考虑使用具有元组或自定义数据类型的单个队列,以便您可以将两个出列newRecord 和 newRecordImage 在一次操作中。