C# 在线程中处理对象

C# 在线程中处理对象,c#,.net,dispose,idisposable,C#,.net,Dispose,Idisposable,我正在开发一个C#应用程序,它从一个设备(Kinect)获取一个流 因为帧速率对于我的CPU来说太高了,所以我尝试使用线程。这似乎解决了我的问题。每次接收到一个新帧时,我都将其放入队列,然后另一个线程执行出列并将该帧写入文件 该线程的代码如下所示: private void myThread() { writer1 = new VideoFileWriter(); writer1.Open(outputFile1, 320, 240, 10, VideoCodec.WMV2);

我正在开发一个C#应用程序,它从一个设备(Kinect)获取一个流

因为帧速率对于我的CPU来说太高了,所以我尝试使用线程。这似乎解决了我的问题。每次接收到一个新帧时,我都将其放入队列,然后另一个线程执行出列并将该帧写入文件

该线程的代码如下所示:

private void myThread()
{
    writer1 = new VideoFileWriter();
    writer1.Open(outputFile1, 320, 240, 10, VideoCodec.WMV2);

    while (!queue.IsEmpty || !streamClosed)
    {
        ColorImageFrame item = null;

        if (!queue.IsEmpty && queue.TryDequeue(out item))
        {
            if (item != null)
            {
                Bitmap result = new Bitmap(320, 240);
                using (Graphics g = Graphics.FromImage(result))
                {
                    g.DrawImage(ImageToBitmap(item), 0, 0, 320, 240);
                    writer1.WriteVideoFrame(result);
                }
            }
            Console.WriteLine("Queue size: "+queue.Count);
        }

        try
        {
            item.Dispose();
        }
        catch (NullReferenceException ex)
        {
            Console.WriteLine(ex.Message);
        }

        if (queue.IsEmpty)
        {
            System.Threading.Thread.Sleep(2000);
        }
    }

    writer1.Close();
    Environment.Exit(0);
}
这似乎很有效,但有时我会收到一个
OutOfMemoryException

我认为我处理线程中使用的对象是错误的


有人能帮我找到这些错误吗?

当运行时无法为您的对象分配内存时,会抛出OutOfMemoryException,这是很明显的

确保你的大型物品不会存活很长时间,并迅速处理它们


只要VideoFileWriter对象是队列中的项目,它就会一直存在,如何初始化它并在循环中处理它,这样就不会占用太多内存?

应该处理位图。您正在处理图形对象,这很好,但位图将占用大量内存,尤其是在循环/计时器事件中。然后尝试GC.Collect(),它将清除任何其他内容。

当队列为空时,在您睡眠的2秒内,可以向队列添加多少项?(我认为你应该在2秒内使用
阻塞集合
而不是队列…)20个项目。因为我收到了三帧中的一帧。我使用的是
ConcurrentQueue
一次性对象的全部意义在于它们保留着垃圾收集器无法处理的内存。