在线程中处理对象

时间:2013-06-19 09:38:39

标签: c# .net dispose idisposable

我正在开发一个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

我认为在处理我的线程中使用的对象时我错了。

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

2 个答案:

答案 0 :(得分:1)

当运行时无法为您的对象分配内存时,抛出OutOfMemoryException,这是显而易见的。

确保您的Big物品不会长寿,并且您可以快速处理它们。

你的VideoFileWriter对象只要它们是队列中的项目就会存在,你如何初始化它并将它放在你的循环中以便它不会占用太多内存?

答案 1 :(得分:-1)

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