FileSystemWatcher 引起的内存不足异常
Out of memory exception caused by FileSystemWatcher
每次在文件夹中创建新图像时,我都会尝试加载图像并对其执行一些处理。代码 运行 在调试模式下正常。但是,当我将可执行文件夹复制到目标机器时。 FileSystemWatcher 每次都抛出 "out of memory" 异常。 .jpg 只有 60KB。代码是用 C# 编写的。
谁能帮我解决这个问题?谢谢你。
private void fileSystemWatcher_Created(object sender, FileSystemEventArgs e)
{
try
{
source = new Image<Gray, byte>((Bitmap)Bitmap.FromFile(e.FullPath));
frame = source.ThresholdBinary(new Gray(180), new Gray(255));
}
catch (Exception ex)
{
MessageBox.Show("File Loading Failed: " + ex.Message);
}
}
堆栈跟踪在这里:
.ctor 在 file:line:column 中的偏移量 342 :0:0
主要在 file:line:column 中的偏移量 59 :0:0
您的问题是您在每次调用 fileSystemWatcher_Created
时都替换了 source
Bitmap
实例,而没有处理前一个实例。 Bitmap
对象是非托管 GDI+ 资源的包装器,当您不再使用它们时必须是 explicitly disposed。这同样适用于您的 frame
对象。下面的代码向您的事件处理程序添加了显式处置。请注意,我正在锁定以避免线程问题。
try
{
lock (fileSystemWatcher)
{
var oldSource = source;
var oldFrame = frame;
source = new Image<Gray, byte>((Bitmap)Bitmap.FromFile(e.FullPath));
frame = source.ThresholdBinary(new Gray(180), new Gray(255));
if (oldSource != null)
oldSource.Dispose();
if (oldFrame != null)
oldFrame.Dispose();
}
}
catch (Exception ex)
{
MessageBox.Show("File Loading Failed: " + ex.Message);
}
每次在文件夹中创建新图像时,我都会尝试加载图像并对其执行一些处理。代码 运行 在调试模式下正常。但是,当我将可执行文件夹复制到目标机器时。 FileSystemWatcher 每次都抛出 "out of memory" 异常。 .jpg 只有 60KB。代码是用 C# 编写的。
谁能帮我解决这个问题?谢谢你。
private void fileSystemWatcher_Created(object sender, FileSystemEventArgs e)
{
try
{
source = new Image<Gray, byte>((Bitmap)Bitmap.FromFile(e.FullPath));
frame = source.ThresholdBinary(new Gray(180), new Gray(255));
}
catch (Exception ex)
{
MessageBox.Show("File Loading Failed: " + ex.Message);
}
}
堆栈跟踪在这里:
.ctor 在 file:line:column 中的偏移量 342 :0:0
主要在 file:line:column 中的偏移量 59 :0:0
您的问题是您在每次调用 fileSystemWatcher_Created
时都替换了 source
Bitmap
实例,而没有处理前一个实例。 Bitmap
对象是非托管 GDI+ 资源的包装器,当您不再使用它们时必须是 explicitly disposed。这同样适用于您的 frame
对象。下面的代码向您的事件处理程序添加了显式处置。请注意,我正在锁定以避免线程问题。
try
{
lock (fileSystemWatcher)
{
var oldSource = source;
var oldFrame = frame;
source = new Image<Gray, byte>((Bitmap)Bitmap.FromFile(e.FullPath));
frame = source.ThresholdBinary(new Gray(180), new Gray(255));
if (oldSource != null)
oldSource.Dispose();
if (oldFrame != null)
oldFrame.Dispose();
}
}
catch (Exception ex)
{
MessageBox.Show("File Loading Failed: " + ex.Message);
}