处理队列更快

时间:2012-11-29 07:59:03

标签: c# arrays multithreading queue

我有一个队列,它会超时接收数据。 我使用多线程出队并保存到数据库。 我创建了一个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

2 个答案:

答案 0 :(得分:1)

您在该线程函数中使用WriteFile

这是否可能,您尝试编写可能被另一个线程(相同的文件名或其他内容)锁定的文件?

还有一件事 - 通过多个线程在磁盘上保存数据 - 我不喜欢它。

我认为你应该创建一些缓冲区而不是许多线程,并且每隔几条记录/条目写一次。

答案 1 :(得分:1)

正如评论中所提到的,只要队列中有元素,你的线程就会存在,因为两者都是空的,线程将终止。这可以解释为什么在调试时只能看到一个活动线程。

您的问题的一个潜在答案是使用System.Collections.Concurrent类中的BlockingCollection而不是Queue。它具有阻塞出队的能力,这将阻止线程直到更多元素可用于处理。

另一个问题是 eQ eiQ 之间的良好竞争条件 - 考虑使用具有元组或自定义数据类型的单个队列,以便您可以将两个出列newRecord newRecordImage 在一次操作中。