C# 更快地处理队列

C# 更快地处理队列,c#,arrays,multithreading,queue,C#,Arrays,Multithreading,Queue,我有一个队列,它超时接收数据。 我使用多线程来出列并保存到数据库。 我创建了一个线程数组来完成这项工作 for (int i = 0; i < thr.Length; i++) { thr[i] = new Thread(new ThreadStart(SaveData)); thr[i].Start(); } 它确实创建了多线程,但当我调试时,只有一个线程处于活动状态,其余的线程处于死状态。 我不知道为什么?有人知道吗?Tks您正在该线程函数中使用WriteFile 这

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

for (int i = 0; i < thr.Length; i++)
{
    thr[i] = new Thread(new ThreadStart(SaveData));
    thr[i].Start();
}
它确实创建了多线程,但当我调试时,只有一个线程处于活动状态,其余的线程处于死状态。
我不知道为什么?有人知道吗?Tks

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

这是否可能,您试图写入的文件可能被另一个线程(相同的文件名或其他东西)锁定

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


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

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

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


另一个问题是EQ和EIQ之间的良好竞争条件——考虑使用一个带有元组或自定义数据类型的单个队列,这样就可以在一个操作中删除NeWRead和NealCeaMediGe。

可能是<代码> SaveDATA运行速度比新线程启动快吗?您能显示线程函数吗?您使用的是SQLServer还是其他数据库?除此之外,看起来您已经有了竞争条件…I new一个线程数组[4]所有的start都为null,因此thr[I]=new thread(new ThreadStart(SaveData));thr[i].Start();要创建线程,我怀疑这不是正确的检查方法,您可以使用日志来了解哪个线程正在调用您的方法。您可以参考此答案来调试多线程应用程序:或将要写入的事件传递到另一个队列!每个记录存储一个图像,方法WriteFile用于将100个图像写入一个特殊文件。因此,当多线程尝试在同一时间将映像写入同一文件时,会发生异常。我想这可能是线程死机的原因我的队列增长如此之快,大约1000/12秒。所以队列不可能耗尽元素。啊,那么你一定要注意比赛条件!
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);
    }
}