0

我有一个队列,它接收数据超时。我使用多线程出列并保存到数据库。我创建了一个线程数组来完成这项工作。

for (int i = 0; i < thr.Length; i++)
{
    thr[i] = new Thread(new ThreadStart(SaveData));
    thr[i].Start();
}

保存数据

注意:eQ 和 eiQ 是 2 个全局队列。我用while来保持线程活着。

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

4

2 回答 2

1

您正在使用WriteFile该线程函数。

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

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

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

于 2012-11-29T08:17:48.023 回答
1

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

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

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

于 2012-11-29T08:22:03.663 回答