Некоторая справочная информация об этом поведении: растровое изображение использует отображенный в памяти файл для доступа к пикселям в растровом изображении.Это очень базовое средство в Windows API, оно позволяет очень эффективно отображать память для хранения данных.Данные считываются из файла только тогда, когда программа читает память, страницы виртуальной памяти не занимают места в файле подкачки Windows.
Точно такой же механизм используется для загрузки сборок .NET.Именно отображение памяти устанавливает блокировку файла.Именно поэтому сборки блокируются, когда они используются в программе .NET.Метод Image.Dispose () снимает блокировку.Борьба с блокировкой часто означает, что вы забыли избавиться от своих растровых изображений.Очень важно, забывание вызова Dispose () не часто вызывает проблемы для классов .NET, за исключением Bitmap, поскольку ему может потребоваться так много (неуправляемой) памяти.
Да, FromStream () не позволяет классу делатьэто оптимизация.Стоимость значительна, вам понадобится удвоить память при загрузке растрового изображения.Это будет проблемой, когда растровое изображение велико, вы пропускаете OOM, когда программа некоторое время работает (фрагментирует адресное пространство), и она не работает в 64-битной операционной системе.Определенно избегайте этого, если ширина растрового изображения x Высота x 4> = 45 МБ, дайте или возьмите.
Некоторый код, вам не нужно перепрыгивать через обруч CopyStream:
public static Image LoadImageNoLock(string path) {
var ms = new MemoryStream(File.ReadAllBytes(path)); // Don't use using!!
return Image.FromStream(ms);
}
Обратите внимание, что вы не хотите утилизировать MemoryStream, вам будет сложно диагностировать «общую ошибку», когда растровое изображение будет использовано, если вы это сделаете.Вызывается ленивым чтением потока класса Image.