Có thể sử dụng phương pháp FromStream của System.Drawing.Image mà không phải giữ luồng mở trong suốt thời gian của hình ảnh không?Tải hình ảnh từ luồng mà không giữ luồng mở
Tôi có một ứng dụng tải một loạt đồ họa trên thanh công cụ từ các tệp tài nguyên, sử dụng kết hợp Image.FromStream
và Assembly.GetManifestResourceStream
.
Sự cố tôi gặp phải trong khi hoạt động tốt trên Windows 7, trên Windows XP, ứng dụng bị treo nếu phần tử giao diện người dùng được liên kết với một trong những hình ảnh này bị tắt. Trên Windows 7, hình ảnh được hiển thị bằng màu xám. Trên XP, nó bị treo với một ngoại lệ bộ nhớ.
Sau khi tải trọng sợi tóc, tôi cuối cùng đã truy tìm nó để tải ban đầu của hình ảnh. Như một vấn đề tất nhiên, nếu tôi có thể tạo bất kỳ đối tượng thực hiện IDisposable
đó cũng bị phá hủy trong các phương pháp tương tự, tôi quấn nó trong một tuyên bố sử dụng, ví dụ
using (Stream resourceStream = assembly.GetManifestResourceStream(resourceName))
{
image = Image.FromStream(resourceStream);
}
Nếu tôi loại bỏ các tuyên bố sử dụng để các isn suối 't xử lý, sau đó ứng dụng không còn treo trên XP. Nhưng bây giờ tôi có một loạt các dòng "mồ côi" treo quanh - các hình ảnh được lưu trữ trong các lớp lệnh và những hình ảnh này được xử lý một cách chính xác khi chúng được xử lý, nhưng luồng ban đầu thì không.
Tôi đã kiểm tra tài liệu cho FromStream
và xác nhận rằng luồng cần phải vẫn mở. Tại sao điều này đã không bị rơi và đốt cháy trên hệ thống phát triển Windows 7 là một bí ẩn tuy nhiên!
Tôi thực sự không muốn luồng này treo xung quanh và tôi chắc chắn không muốn lưu trữ tham chiếu tới luồng này cũng như hình ảnh để tôi có thể xử lý nó sau này. Tôi chỉ có nhu cầu của dòng đó một lần vì vậy tôi muốn để thoát khỏi nó :)
Có thể tạo hình ảnh và sau đó giết luồng ở đó không?
Vào cách, một 'OutOfMemoryException' trong' System.Drawing' có nghĩa là * lỗi chung * trong GDI +. Lý do cho điều này là [historical] (http://stackoverflow.com/questions/2610416/is-there-a-reason-image-fromfile-throws-an-outofmemoryexception-for-an-invalid-im) và đến hạn để ánh xạ các mã lỗi không được quản lý. –
Nếu luồng bạn truyền tới Image.FromStream không thể tìm kiếm được, bạn có thể đóng luồng một cách an toàn. Nhưng đây là hành vi không có giấy tờ nên hãy tự chịu rủi ro. – user2452157