2016-08-31 25 views
10

Ứng dụng ASP.NET trên máy chủ của tôi bắt đầu ném ngoại lệ GDI + sau khi chạy trong vài ngày. Sau khi tôi khởi động lại máy chủ, tất cả các công trình tốt cho một vài ngày và sau đó đột nhiên ngoại lệ này xảy ra một lần nữa. Sau lần đầu tiên nó xảy ra, nó xảy ra mỗi khi tôi cố gắng để lưu một hình ảnh PNG, cho đến khi tôi khởi động lại một lần nữa.GDI + ngoại lệ khi lưu hình ảnh ở định dạng PNG

Khi tôi cố gắng lưu hình ảnh trong JPEG, nó hoạt động tốt.

Khi tôi chạy mã này từ dự án của tôi, nó không thành công:

var path = @"C:\Project\images\logo.png"; 
var image = Image.FromFile(path); 

using (var ms = new MemoryStream()) 
{ 
    image.Save(ms, ImageFormat.Png);  // Fails here on GDI+ exception. 
    //image.Save(ms, ImageFormat.Jpeg); // JPEG works somehow 
} 

Một lần nữa: Khi tôi khởi động lại máy tính để bàn từ xa và chạy mã này, nó làm việc cho một vài ngày và tại một số thời điểm đột nhiên bắt đầu thất bại hơn và hơn.

tôi đã cố gắng:

  1. Để thực hiện một ứng dụng giao diện điều khiển với cùng mã và chạy nó trong RDP nơi dự án là. Nó hoạt động tốt!

  2. Rất nhiều biến thể khác nhau của mã được đề xuất trong hơn 10 bài viết tôi đã đọc về chủ đề này.

  3. GCI.Collect() - không cần trợ giúp.

  4. Kiểm tra tất cả các thư mục có quyền ghi (có thể có thứ gì đó với IIS?).

  5. Thêm.

Tôi nghĩ rằng cần có một số cấu hình đột nhiên thay đổi do điều gì đó và tôi không thể hiểu nó là gì.

+0

Hãy thử sử dụng 'Image img = Image.FromStream (MemoryStream mới (File.ReadAllBytes (đường dẫn)));'. Xem http://stackoverflow.com/questions/788335/why-does-image-fromfile-keep-a-file-handle-open-sometimes –

+0

Định dạng hình ảnh không phải là lý do thực sự. Nhiều khả năng: Bạn cố gắng ghi đè lên bản gốc (png). Xem [ở đây] (http://stackoverflow.com/questions/37736815/overwrite-image-picturebox-in-c-sharp/37741101?s=1|5.7472#37741101) – TaW

+1

Vậy ngoại trừ chính xác là gì? – Evk

Trả lời

8

Sau khi khởi động lại máy chủ, tất cả hoạt động tốt trong vài ngày và đột nhiên ngoại lệ này xảy ra và sau lần đầu tiên xảy ra nó sẽ xuất hiện mỗi khi tôi cố gắng lưu hình ảnh PNG, cho đến khi tôi khởi động lại.

Âm thanh như bộ nhớ bị rò rỉ với tôi. Phiên bản .NET nào được biên dịch? Những gì hệ điều hành máy chủ này chạy trên?

Bạn có thể bắt đầu bằng cách kèm theo hình ảnh của bạn trong một khối sử dụng:

var path = @"C:\Project\images\logo.png"; 
using (Image image = Image.FromFile(path)) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     image.Save(ms, ImageFormat.Png); 
    } 
} 

This link Tôi tin rằng có liên quan đến trường hợp của bạn.

3

Nó ném lỗi GDI + vì một trong các đối tượng của bạn không được xử lý, vì vậy hãy vứt bỏ đối tượng đã sử dụng tốt hơn.

Nếu bạn gặp lỗi đó, thì tôi có thể nói rằng ứng dụng của bạn không có quyền ghi trên một số thư mục.

GDI + hạn chế chiều cao của một hình ảnh để 65534

Luôn ủng hộ sử dụng báo cáo kết quả sử dụng. Mà không bao giờ quên để vứt bỏ một đối tượng, ngay cả khi mã ném một ngoại lệ.

var path = @"C:\Project\images\logo.png"; 
using (Image image = Image.FromFile(path)) 
{ 
     using (var ms = new MemoryStream()) 
     { 
      image.Save(ms, ImageFormat.Png); //fails here on GDI+ exception. 
      //image.Save(ms, ImageFormat.Jpeg); //Jpeg Works somehow 
     } 
} 

Các phương pháp FromFile khóa tập tin, vì vậy sử dụng Image.FromStream() phương pháp đọc hình ảnh:

byte[] bytes = System.IO.File.ReadAllBytes(filename); 
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes); 
using (var ms = new MemoryStream()) 
{ 
     image.Save(ms, ImageFormat.Png); //fails here on GDI+ exception. 
     //image.Save(ms, ImageFormat.Jpeg); //Jpeg Works somehow 
} 
0

Về cơ bản, nếu bạn có các đối tượng dùng một lần ... Vứt bỏ chúng! Hình ảnh dùng một lần và dưới dạng bitmap, nó sử dụng tài nguyên cửa sổ. Nếu bạn không vứt bỏ, tài nguyên cửa sổ sẽ không được giải phóng cho đến khi bạn tắt ứng dụng của mình. Vì vậy, bạn cần phải vứt bỏ bất kỳ hình ảnh nào được tạo ra.

Các vấn đề liên quan