我有一个程序,我从相机中获取位图图像加载它们 阻止线程中的收集和处理。我从UI线程调用SetImage。 它工作几秒钟然后我遇到内存不足异常。请指教
Class MyThread
{
BlockingCollection<Bitmap> q = new BlockingCollection<Bitmap>();
Thread thread;
public MyThread()
{
thread = new Thread(ThreadFunc);
thread.Start();
}
void ThreadFunc()
{
Bitmap local_bitmap = null;
while (!exit_flag)
{
// This blocks until an item appears in the queue.
local_bitmap = q.Take();
// process local_bitmap
}
}
public void SetImage(Bitmap bm)
{
q.Add(bm);
}
}
答案 0 :(得分:1)
你需要在代码中处理Bitmap对象,因为它包含托管资源,线程函数应该是:
void ThreadFunc()
{
while (!exit_flag)
{
// This blocks until an item appears in the queue.
using (Bitmap local_bitmap = q.Take())
{
// process local_bitmap
}
}
}
GC旨在自动管理内存,但与调度GC时一样,运行时会考虑分配的内存内存量,而不是非托管内存使用量。因此,在这种情况下,您需要通过自己处理对象或调用GC.AddMemoryPressure来加速GC。