C# 在线程中处理对象
我正在开发一个C#应用程序,它从一个设备(Kinect)获取一个流 因为帧速率对于我的CPU来说太高了,所以我尝试使用线程。这似乎解决了我的问题。每次接收到一个新帧时,我都将其放入队列,然后另一个线程执行出列并将该帧写入文件 该线程的代码如下所示: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);
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
一次性对象的全部意义在于它们保留着垃圾收集器无法处理的内存。